-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
3차 세미나 과제 (기본 과제 + 심화과제) - MainPage, MyPage #3
base: main
Are you sure you want to change the base?
Conversation
(scroll Indicator X, 구조 변경 필요)
(scroll Indicator X, 구조 변경 필요)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
최고다 ...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오 저도 이거 이렇게 정리해둬야겠다고 생각하고 있었는데 먼저 해두셨군요 🤩
참고하겠습니다 ^__^
var interGroupSpacing: CGFloat { | ||
switch self { | ||
case .header: | ||
return 0 | ||
default: | ||
return 10 | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
움 .header 를 제외한 다른 모든 경우라 default 를 쓰신 것 같은데
가독성을 위해 아래와 같이 하면 어떨까요??!
var interGroupSpacing: CGFloat { | |
switch self { | |
case .header: | |
return 0 | |
default: | |
return 10 | |
} | |
} | |
var interGroupSpacing: CGFloat { | |
switch self { | |
case .header: | |
return 0 | |
case .normal, .live, .banner: | |
return 10 | |
} | |
} |
완전 개인 취향인 것 같아서 편하신대로 해도 될 것 같긴 해요 :)
case live = "Live" | ||
case banner = "Banner" | ||
|
||
var itemSize: NSCollectionLayoutSize { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hoxy NSCollectionLayoutSize 가 뭔지 알려주실 수 있나요?!
사용하는건 처음 보는 것 같아서유 !!
|
||
extension MainViewContentsCell { | ||
|
||
func setStyle() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CustomTvingButton 에서는 style 잡는 함수가 style()
이었는데
이름이 달라서 같은 역할인지 아닌지 헷갈릴 수도 있다고 생각합니다
(극단적으로 생각했을 때 ㅎㅎ...)
고로 함수 이름 통일하면 어떨까,,, 하는 생각? 의견? 리뷰? 입니닷,,
func configureCell(_ contents: Contents) { | ||
contentsImg.image = contents.image | ||
contentsName.text = contents.name | ||
contentsSubName.text = contents.subName | ||
|
||
if (contentsName.text == nil) { | ||
contentsName.isHidden = true | ||
} else { | ||
contentsName.isHidden = false | ||
} | ||
if (contentsSubName.text == nil) { | ||
contentsSubName.isHidden = true | ||
} else { | ||
contentsSubName.isHidden = false | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
func configureCell(_ contents: Contents) { | |
contentsImg.image = contents.image | |
contentsName.text = contents.name | |
contentsSubName.text = contents.subName | |
if (contentsName.text == nil) { | |
contentsName.isHidden = true | |
} else { | |
contentsName.isHidden = false | |
} | |
if (contentsSubName.text == nil) { | |
contentsSubName.isHidden = true | |
} else { | |
contentsSubName.isHidden = false | |
} | |
} | |
func configureCell(_ contents: Contents) { | |
contentsImg.image = contents.image | |
if let name = contents.name { | |
contentsName.text = name | |
} else { | |
contentsName.isHidden = true | |
} | |
if let subName = contents.name { | |
contentsSubName.text = subName | |
} else { | |
contentsSubName.isHidden = true | |
} | |
} |
위에 contentsName.text = contents.name 을 하고
그 아래에 또 contentsName.text == nil 을 확인한 뒤 값이 있으면 isHidden 을 false 로 한다~
는 코드의 중복이 조금 있는 것 같습니다..!!
제 나름대로 코드 양을 조금 줄이려고 노력해봤는데 잘 됐는지는 모르겠네욥!!
func getNickNameOrId() -> String { | ||
if let nickName = self.nickName { | ||
return nickName | ||
} else { | ||
guard let id = self.id?.components(separatedBy: "@").first else { return "" } | ||
return id | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오늘 원티드 프리온보딩 들으면서 배운 점인데,
함수 네이밍 할 때 or() 나 and() 라는 내용으로 함수를 만드는건
하나의 함수 내에서 여러 역할을 하는거라 지양하라고 하셨습니닷
getNickName() 따로 getId() 따로 만들어 두는건 어떨까요???
|
||
import UIKit | ||
|
||
class BottomMenu: UIView { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오우 어떤 역할을 하는 애인지 조금 헷갈렸숩니닷
아마 TabBar 를 의도하고 만드신 것 같은데!
더 많은 기능을 위해서는 UIView 보다 UITabBar 또는 UITabBarController 로 BottomMenu 를 만드는게 좋지 않을까 싶습니다!
공식문서입니닷 ^___^
https://developer.apple.com/documentation/uikit/uitabbar
|
||
import UIKit | ||
|
||
class LoginView: BaseView { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
어엇 여기 final 깜빡하셨어요!!
backBtn.snp.makeConstraints{ | ||
$0.height.equalTo(15) | ||
$0.width.equalTo(8) | ||
$0.top.equalTo(self.safeAreaLayoutGuide).inset(25) | ||
$0.leading.equalToSuperview().inset(24) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
back button 이 아마 그냥 상단 위치가 아닌
navigationBar 에 들어갈 것 같습니다 !
아니 근데 이거 테스트해보려고 앱 실행했는데 심화과제까지 완료한거 실화...?
나도 코드리뷰 말고 과제나 하러 가야겠다....
나도 PR 올리고 다시 리뷰하러 올게요...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
진짜 수고 많았어용🫶🏻🫶🏻🫶🏻🫶🏻🫶🏻🫶🏻 너무 깔끔하게 잘하신 거 가탕용
Contents(image: .paramount5, name: "1923", sectionNum: 5)]] | ||
|
||
return contents | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
우와 정리 깔끔하네여.. 진짜 깔끔 다예...
import SnapKit | ||
import Then | ||
|
||
class MainView: BaseView { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
MainView를 상속받는 애가 있나요?? 없우면 final 고고링
|
||
class MainViewPagingIndicator: UICollectionReusableView { | ||
|
||
static let identifier = "MainViewHeaderPagingFooter" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
identifier 꿀코드 띵띵땅땅띵~ 하심 조을 거 같아영
private func createLayout() -> UICollectionViewLayout { | ||
|
||
let config = UICollectionViewCompositionalLayoutConfiguration() | ||
config.interSectionSpacing = 30 | ||
|
||
let layout = UICollectionViewCompositionalLayout(sectionProvider: { (sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in | ||
|
||
guard let sectionLayout = ContentsSectionLayout(rawValue: Contents.sectionLayout()[sectionIndex]) else {return nil} | ||
|
||
let itemSize = sectionLayout.itemSize | ||
let item = NSCollectionLayoutItem(layoutSize: itemSize) | ||
let group = NSCollectionLayoutGroup.horizontal(layoutSize: itemSize, subitems: [item]) | ||
let section = NSCollectionLayoutSection(group: group) | ||
|
||
section.orthogonalScrollingBehavior = sectionLayout.orthogonalScrollinBehavior | ||
section.interGroupSpacing = sectionLayout.interGroupSpacing | ||
section.boundarySupplementaryItems = sectionLayout.header | ||
section.boundarySupplementaryItems += sectionLayout.footer | ||
|
||
if sectionLayout.rawValue == "Header" { | ||
section.visibleItemsInvalidationHandler = { visibleItems, scrollOffset, layoutEnvironment in | ||
self.mainPagingIndex = Int(scrollOffset.x / (self.view.frame.width * sectionLayout.itemSize.widthDimension.dimension)) | ||
} | ||
} | ||
return section | ||
}, configuration: config) | ||
|
||
return layout |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이것이..말로만 듣던......컴포지셔널 레이아웃....????????
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이게 편한거 맞나여 완전 어려워 보이네여..ㅜㅜ 짱입니다
|
||
class MainView: BaseView { | ||
|
||
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewLayout()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이렇게 메인뷰에서 collectionView 선언해주고 뷰를 로드하는 뷰컨에서 레이아웃을 설정하는 거 맞나요?????
|
||
import UIKit | ||
|
||
class MainParamountViewController: MainBaseViewController { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ㅋㅋㅋㅋㅋㅋ 너무 귀찮았을 거 같은데
🔥 Pull requests
🌴 #1
✅ 작업한 내용
❗️PR Point
코드의 구조도 뭔가 이상하고 코드도 복잡한 것 같아요...... 수정이 많이 필요해여...
정말정말 열심히 했어용....ㅋㅋㅋ...ㅜㅠ
어떤 리뷰든 정말 진심으로 감사합니다... 🥹
기본 과제
TableView Cell이 나오기 전까지를 TableView의 전체 Header로 잡고, 하단의 로그아웃 버튼을 TableView의 전체 Footer로 잡은 뒤, 각각 UIView로 구현해줬습니다. (재사용 할 필요가 없다고 생각해 따로 register하는 과정 없이 바로 넣어줌)
-> 이게 맞나여..?
TableView Cell에 들어갈 dummy를 섹션별로 나누어주기 위해 2차원 배열로 선언
LogIn 화면에서 입력한 User 정보를 받아와 MyPage에 보여지도록 구현함
심화 과제
MainPage의 홈부분 View를 전체를 CollectionView 하나로 잡고 CompositionalLayout을 커스텀해서 Section을 나누어 구현
Section별 Layout을 따로 커스텀해줘야하기 때문에 구현을 편리하게 하기 위해 enum으로 케이스를 분류해준 뒤 케이스 각각의 Layout을 잡기 위한 속성들을 정의해줌 (TVING 앱을 봤을 때 크게 네가지 케이스가 있다고 생각함..)
메인 이미지가 좌우로 이동하면, 인덱스에 맞춰 이동하는 동그라미 점들은 Section의 Footer로 넣어줬기 때문에 delegatePattern을 이용해 이미지의 인덱스를 전달해줌
PageViewController를 사용해 MainPage의 Paging을 구현 (Scroll 이벤트를 감지해 상단의 바를 없애고 색상을 바꿔주기 위해 DelegatePattern 사용)
📸 스크린샷
Login 시 입력했던 이메일 아이디의 아이디 부분이 전달됨
2023-05-04.4.49.14.mov
MyPage
2023-05-04.5.06.31.mov
MainPage
(홈 말고 실시간, TV프로그램, 영화 ...는 이미지 캡쳐에용ㅋㅋ)
2023-05-04.5.08.03.mov
closed #이슈번호