toss ์ฑ ํด๋ก ์ฝ๋ฉ ๋๋ฒ์งธ. ํ๋ทฐ๋ฅผ ๋ง๋๋ ์ค์ด๋ค. ์ด๋ฒ์ ๊ฐ๋ฐํ๋ฉด์ ๋ชฉํ๋ก ์ธ์ ๋ ๊ฒ์ ์งํค๋ฉด์ ๊ณต๋ถํ๋๋ผ ์กฐ๊ธ ์๊ฐ์ด ์ค๋๊ฑธ๋ ธ๋ค. ^___^ (๋ฐ๋ณธ๊ฐ ใ
)
- ๊ธฐ์ด ๊ฐ๋ ๋ ๋์น์ง ์๊ณ ํ์คํ๊ฒ ํ๊ณ ๋์ด๊ฐ ๊ฒ
- ๊ฐ๋ฐ ๊ณผ์ ์ ๊ธฐ๋กํ ๊ฒ
- ๊ตฌํํ๋ ค๊ณ ํ๋ UI ์ปดํฌ๋ํธ๊ฐ ์๋ค๋ฉด, ์ถฉ๋ถํ ๊ณ ๋ฏผํ๊ณ ๊ตฌํํ ๊ฒ
๐ต ๊ตฌํํ๋ ค๊ณ ํ๋ ํ๋ฉด
- 1๋ฒํ๋ฉด์ ์ ๋ฌผ์์๊ทธ๋ฆผ์ x ๋๋ฅด๋ฉด ์์ด์ง๋ ๊ด๊ณ (?)๋ทฐ์
- ๊ด๊ณ ๋ทฐ(?)๊ฐ ์๋ ํ๋ฉด์ ๊ตฌํํ ์์ !
๐ต 'ํ ์ค๋ฑ ํฌ, ์์ฐ, ์๋น' ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํด์ผํ ๊น
๐น UICollectionView๋ก ๊ตฌํํ๋๊ฒ ๋ง์๊น
https://github.com/DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown/pull/7
1์ฐจ์ ์ผ๋ก ๋ด๊ฐ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ด๋ค. ๊ณผ์ฐ ํํญ์ ๊ฐ์ฅ ์ด๋ฐ ํ๋ฉด์์ 'ํ ์ค๋ฑ ํฌ, ์์ฐ, ์๋น' ์ธ๊ฐ์ ๋ฅ๊ทผ๋ชจ์๋ฆฌ ์ฌ๊ฐํ ๋ฆฌ์คํธ๋ฅผ ๋ฌด์์ผ๋ก ๊ตฌํํด์ผํ ๊น? ๊ฐ์ ๋ชจ์์ ์ฌ๊ฐํ์ด ์ธ๋ฒ ๋ฐ๋ณต๋๋ค๊ณ ์๊ฐํ์ฌ ์ด๋ฐ์ collectionView๋ก ๊ตฌํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
๊ทผ๋ฐ ๊ตฌํ์ ํด๋ณด๊ณ ๋๋๊น ๊ณ ๋ฏผ์ด ์๊ฒผ๋ค. ๋๋ CollectionView๋ '๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ฅ๋ scroll์ ํตํด์ ๋ฌดํ(?)ํ๊ฒ ์์ฑํ ์ ์๋ค๋์ '๊ณผ 'reusable'ํ๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ์ฅ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค. ํ์ง๋ง ์ง๊ธ ๊ตฌํํ ๊ฒ์ ๋จ์ "ํ ์ค๋ฑ ํฌ, ์์ฐ, ์๋น" ์ธ๊ฐ์ ๋ฐ์ดํฐ๋ง ํ์๋กํ๊ณ , ์์ดํฐ์ ์ฌ์ง ์ฑ ์ฒ๋ผ ๋ฌดํํ๊ฒ scroll ๋ ํ์๊ฐ ์๋ค. ๊ทธ๋ ๋ค๋ฉด collectionView๋ก ๊ตฌํํ๋๊ฒ ๋ง๋์ง ์๋ฌธ์ด ๋ค์๋ค.
๋ฌผ๋ก scrollview๋ก ๊ตฌํํ ์๋ ์๋ค. ํ์ง๋ง collectionView์ ์ฅ์ ์ ์ ์ ํ๊ฒ ์ฌ์ฉํ์ง ๋ชปํ๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ ๊ตณ์ด collectionView๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๊ฒ ๋๋ฐ? ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
๐น ๊ทธ๋์ ์๊ฐํ ๋ฐฉ์, UIStackView๋ฅผ ์ด์ฉํด๋ณด์
ํด๋น ๊ณ ๋ฏผ์ ๋ํด์ ๋ฉํ ์๊ฒ ์ด์ผ๊ธฐํด๋ณด์๋ค. ๋ฉํ ๋ collectionView๋ก ๊ตฌํํด๋ ์ข์ง๋ง ๋ด ์๊ฒฌ์ฒ๋ผ collectionView์ ์ฅ์ ์ ์ถฉ๋ถํ ํ์ฉํ์ง ๋ชปํ๋ ์ํฉ์ด๋ผ stackview๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ ๊ฒ ๊ฐ๋ค๊ณ ์กฐ์ธํด์ฃผ์๋ค.
UIStackView๋ฅผ ์์ ๋ชฐ๋๋ ํฐ๋ผ, ์กฐ๊ธ ์ฐพ์๋ณด๊ณ ๊ฐ์ด ๋ฌธํ์ผํฐ์ ์ฐธ์ฌํ๋ ๋ฉํฐ๋ค์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถ๋ฅผ ์์ํ๋ค.
Stackview๋ฅผ ์ด์ฉํ๋ฉด 'SwiftUI'์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๊ฒ ๊ฐ์๋ค. SwfitUI์์๋ ๋ทฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ Vstack, Hstack, Zstack์ ์๊ณ ๊ทธ ์์ UI ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ ค์ค๋ค. UIKit์ UIStackView๋ ์คํฌ๋กค์ด ๋ด์ฅ๋์ด์๊ณ , StackView ์์ ์ํ๋ UI ์ปดํฌ๋ํธ๋ฅผ ์์๋๋ก ์ฌ๋ ค์ฃผ๋ฉด ๋๋ ๊ฒ์ด์๋ค.
https://developer.apple.com/documentation/uikit/uistackview
์ ์ฌ์ง์ด stackView๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํ ๊ฒ์ธ๋ฐ, distribution์ผ๋ก ๋ฐฉํฅ(?)์ ์ค์ ํด์ฃผ๊ณ , ๊ทธ ์์ ํ๋์ UI์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ผ๋ฉด, ๋์ผํ spacing ๊ฐ๊ฒฉ์ ์ฃผ๋ฉด์ ๋ฆฌ์คํธ์ฒ๋ผ ๋ณด์ฌ์ง๊ฒ ํด์ค๋ค.
๊ทธ๋์ ๋๋, 'ํ ์ค๋ฑ ํฌ', '์์ฐ', '์๋น' ์ธ ๊ฐ์ UI ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๊ฐ ๋ฐ๋ก ๋ง๋ค์ด ์ค ๋ค์, ์ธ ๊ฐ๋ฅผ stackview์ ์ฌ๋ ค์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ ๋ฐฉ์์ ๋ฐ๊พธ์๋ค.
https://github.com/DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown/issues/9
๐ต UIScrollview, UIStackView ์ด์ฉํ๊ธฐ
๐ต dummy data ๋ง๋ค๊ธฐ
๐ต table view ๋ ์ด์์.. ์์ ํ๊ธฐ...
๋ ์ด์์ ๋์ฐธ์ฌ๊ฐ ์ผ์ด๋ฌ๋ค.
hierarchy ๋ฅผ ์ดํด๋ณด๋, table view๋ฅผ ์๊ณ ์๋(?) ๋งจ ํ์ stackView์ ํฌ๊ธฐ๊ฐ ๊ต์ฅํ ์๊ฒ ์กํ์์๋ค. ์ด stackView์ ๋ ์ด์์์ ์์ ํด์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ์๋ค.
// stackView์ layout
extension HomeCell {
func setupViews() {
addSubview(cellStackView)
cellStackView.snp.makeConstraints {
$0.edges.equalToSuperview()
}
}
}
stackView์ edges๋ฅผ superview์ ์ ๋ง์ถฐ์ฃผ์๋๋ฐ, ์ stackview๋ ์์ฃผ ์๊ฒ ๋์จ๋๊ฑด๊ฐ?
stackview์ superView๋ scrollView์ธ๋ฐ, scrollview๋ ์๋ hierarchy๋ฅผ ๋ณด๋ฉด, ๊ฝ์ฐฌ ๋ทฐ์ด๋ค. ์ ์๋ง์ถฐ์ง๋๊ฑฐ์ง? ๋ด๊ฐ snapkit์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํด์ ๊ทธ๋ฐ๊ฑด๊ฐ..
๐น ํด๊ฒฐ ๋ฐฉ์
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค. UIScrollview ์์ ๋น์ด์๋ UIView๋ฅผ ์ฌ๋ ค์ UIView ํ์์ StackView๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
private func setupLayout() {
view.addSubview(scrollView)
scrollView.snp.makeConstraints {
$0.edges.equalToSuperview()
}
scrollView.addSubview(contentView)
contentView.snp.makeConstraints {
$0.edges.equalToSuperview()
$0.width.equalToSuperview()
}
contentView.addSubview(homeListStackView)
homeListStackView.snp.makeConstraints {
$0.leading.equalToSuperview().inset(16.0)
$0.trailing.equalToSuperview().inset(16.0)
$0.top.equalToSuperview()
$0.bottom.equalToSuperview()
}
}
์ด๋ ๊ฒ ํ๋๊น ์๋์ฒ๋ผ ๋ด๊ฐ ์ํ๋ ํํ๋ก stackView์ ํฌ๊ธฐ๊ฐ ๊ฝ์ฐฌ ๋ชจ์ต์ผ๋ก ๊ตฌํ๋์๋ค.
์ฌ๊ธฐ์ ๊ถ๊ธํ์ ์, ์ด๋ ๊ฒ StackView์์ ๋น์ด์๋ UIView๋ฅผ ๊ผญ ์ฌ๋ ค์ ๋ง์ถฐ์ฃผ์ด์ผํ๋๊ฐ? ์ด๋ค.
๐ต tableviewCell์ UIImage์ UILabel์ด ์๋จ๋ ๋ฌธ์
์์ ๋ฆฌ์คํธ์ ์ ๊ฒ์ ์ ๋ค๋ชจ๋ค๋ชจ๋ง ๋ ์๋.. cell์ uiimage์ uilabel์ ๋ฃ์ด์ฃผ์๋๋ฐ, ๋ค์ด๊ฐ์ง ์๊ณ ๊ตฌํ๋์๋ค. (์ด๋ด์๊ฐ!) ๋ถ๋ช ํ cell์์ addsubview๊ฐ ์๋์๊ฑฐ๋, dummy data๊ฐ ์ ๋ฌ๋์ง ์์๋๋ณด๋ค.
์๋๋๋ค๋ฅผ๊น ์ด๋ ๊ฒ class ์์ cellList๋ฅผ ๋ณ์๋ก ์ ์ธํด์ฃผ์๋๋ฐ, ์ด๋ฅผ ๋ฐ์ง ์์๊ฒ์ด๋ค! (dummy data๊ฐ ์๋ค์ด์ค๋ ์ํฉ) ์ด๋ cell์ ๋ ์ด์์์ ์ค์ ํด์ฃผ๋ function์ ๊ตฌํ๋์ง ์์๋๊ฒ ๋ฌธ์ ์๋๋ฐ, ์ฌ๊ธฐ๋ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๊ฒ ํด์ฃผ๋ฉด ๋๋ค.
tableViewDataSource์์ ์ด setup() function์ ์ด์ฉํด์ cell์ ๋ฟ๋ ค์ฃผ๋๋ฐ, ์ฌ๊ธฐ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค์ง ์๊ณ , ์ง์ง ๋ ์ด์์๋ง ๋ฟ๋ ค์ค ๊ฒ์ด๋ค. ์ฌ๊ธฐ๋ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋น.
์ด๋ ๊ฒ cellList์ ํ๋ผ๋ฏธํฐ row๋ก ๋ฐ์ ๊ฒ์ ๋ฃ๊ฒ ๋ค๊ณ ์ ์ธ~~ ์ด๋ ๊ฒํ๋ฉด?!?! ์ ์์ ์ผ๋ก ์ถ๋ ฅ์ด ๋ ๊น ๋๊ทผ๋๊ทผ
์ง์ ^__^ ์ผ๋จ UILabel๋ก ์ด๋ฃจ์ด์ง Title๊ณผ SubTitle์ด ์๋ฌ๋ค. ์ด๋ฏธ์ง๋ง ๋ ์ด์์์ผ๋ก ์กํ ์ํฉ! (hierarchy๋ฅผ ํ์ธํด๋ณด๋๊น UIImage ๋ค์ ์ด๋์๋ UILabel์ ์๋ค ๊ทธ๋ฅ ์ด๊ฒ๋ addsubView๊ฐ ์๋๋ฏ?!) ์ด์ ์ด๊ฑธ ํด๊ฒฐํด๋ณด์.
๐ต UILabel ์ด๋จ๋
์ง๊ธ ๋น๋๋ฅผ ํด๋ณด๋ฉด, ์๋์ฒ๋ผ ์ถ๋ ฅ๋๋ค.
์ํ ๋ก๊ณ ์ฌ์ง์ด ์ ๋ ๊ฒ ๊ธธ๋ฉด ์๋๊ณ , ์ ์์ title ๊ณผ subTitle์ด ๋ค์ด๊ฐ์ผํ๋๋ฐ, hierearchy๋ฅผ ์ดํด๋ณด์๋ title๊ณผ subTitle์ด ๊ทธ ์ด๋์๋ ๊ตฌํ๋์ด์์ง ์์์๋ค. ์ฌ๊ธฐ์ addsubview๊ฐ ๋์ง ์์๋? ๊ณ ๋ฏผํ๋ ์ฐฐ๋์... ์ํ ๋ก๊ณ ๋ฅผ ๋จผ์ ์ค์ฌ์ label์ ์ฌ๋ ค๋ณด๊ณ ์ ์ํ๋ก๊ณ ์ด๋ฏธ์ง๋ฅผ ํฌ๊ธฐ๋ฅผ ์ฐ์ ์ค์ด๊ณ ์ ํ๋ค.
์ผ๋จ ์ํ ๋ก๊ณ ๊ฐ ์ ๋ ๊ฒ ์ข์ฐ๋ก ๊ธธ๊ฒ ๋จ๋ ์ด์
listImageView.snp.makeConstraints {
$0.leading.equalToSuperview().inset(24.0)
$0.width.height.equalTo(40.0)
$0.top.equalToSuperview().inset(20.0)
$0.trailing.equalToSuperview().inset(20.0)
}
๋ ์ด์์์ ์๋ชป์ก์๋ค! trailing์ผ๋ก ์ก์ผ๋๊น trailing๋ถ๋ถ์ด 20 ๋ง ๋จ๊ธฐ๊ณ ๊ธธ์ด์ง๊ฒ. ์ฌ๊ธฐ์๋ ์ฌ์ง์ด ์ผ์ชฝ์ผ๋ก ์๊ฒ ๋ค์ด๊ฐ์ผ ํ๋ฏ๋ก leading๊ณผ, width, top, bottom ์ ์ก์์ผํ๋ค.
listImageView.snp.makeConstraints {
$0.leading.equalToSuperview().inset(24.0)
$0.width.height.equalTo(40.0)
$0.top.equalToSuperview().inset(20.0)
$0.bottom.equalToSuperview().inset(20.0)
}
์ ์ด๋ ๊ฒ ์ด์ ์ฌ์ง์ ์ค์ฌ์ก๋ค. ๊ทธ๋ค์ ํ ์ผ์ ์์ด์ง Label ์ถ๋ ฅ์ํค๊ธฐ!! ์ด๊ฒ๋ ์๋ง ๋ ์ด์์์ ๋ฌธ์ ๊ฐ ์์ด์ ์ถ๋ ฅ์ด ์๋๋ ํ๋ฅ ๊ฑฐ์ ๋ญ 99%..
๊ทผ๋ฐ bottom์ผ๋ก ๋ฐ๊พธ๋๊น, UILabel์ด ๋ฑ์ฅํ๋ค.
์๋ง ์ํ๋ก๊ณ ์ด๋ฏธ์ง์ ๋ฐ๋ ค์ ๋ ์ด์์์ ์ก์์ด๋, ๋ทฐ ๋ด๋ถ์ ์ถ๋ ฅ๋์ง ์์๋ ๋ฏ ์ถ๋ค. ๊ธ์๊ฐ ์งค๋ฆฌ๊ณ ๊ทธ๋ฐ ์ธ๋ฐํ ๋ ์ด์์์กฐ์ ์ด ํ์ํ์ง๋ง ์ผ๋จ ํด๊ฒฐ!
๐ต ๋ ์ด์์๊ด๋ จํ ์๋ฌ๋ฅผ ๋ง์ฃผ์ณค๋น
โ ๏ธ fatalError("Expected superview but found nil when attempting make constraint `equalToSuperview`.")
์ฃผ๋ก ์ด ์๋ฌ๋ addsubview๋ฅผ ํ์ง ์์์ ์๊ธฐ๋ ๋ฌธ์ ์ด๋ค. ํ์ง๋ง ๋์ ๊ฒฝ์ฐ, addsubview๋ ํ์ง๋ง, switch ๋ฌธ์ ์ฌ์ฉํ๋ฉด์ ๋ทฐ๋ฅผ ์ ํ์ ์ผ๋ก ์ฌ๋ ค์ค์ผํ๋๋ฐ, ์ด๊ณผ์ ์์ ๋ ์ด์์์ ์๋ชป์ค์ ํด์ ๋ทฐ๊ฐ ๋ก๋๋์ง ์์ผ๋ฉด์! ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. (equalToSuperView๋ ์ ๋๋ก ๋์๊ฐ์ง ์์๊ณ , ๋ฌถ์ฌ์๋ auto layout์ด ์ ํ ์๋๋์ง ๋ชปํ๋ ์ํฉ์ด์๋ค.
https://didu-story.tistory.com/293
๊ทธ๋์ ์ง๊ธ๊น์ง ์๋ฃํ ํ๋ฉด์ , ์ด๊ฒ
๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฏ๋ (์ผํธ์ ์๋) ์ก๊ธ๊ณผ ๋ด์ญ๋ฒํผ๋ ์ ์์ ์ผ๋ก ๋จ๊ณ , ๋ชจ๋ ๊ฒ ์ผ๋จ ํ๋ฉด ์์ผ๋ก ๋ฑ์ฅํ๋ค. ๋๋์ด ^__^
๐ต ๋๋์ด ์ต์ข
์ด์ ์์์ ์์ ๋ค ์์ ์ฃผ๊ณ cornerRadius์ถ๊ฐ, ๊ธ์ ์์น ์กฐ์ , ์ ๋์ด ์์ , ๋ฒํผ ์์น๋ณ๊ฒฝ ๋ฑ ๋ ์ด์์์ ์กฐ๊ธ์ฉ ์๋ด์ฃผ๊ณ ์๋์ ๊ฐ์ ํ๋ฉด์ ์์ฑํ๋ค ^___^
๋ค์์ผ๋ก ํ ์์ ์.. ๋ฒํผ๋๋ ์๋ ํ๋ฉด์ด๋ํ๋๊ฑฐ๋ ๋ถ๊ฐ์ ์ธ ๊ฒ๋ค์ ์ข ๊ตฌํํด์ ํํ๋ฉด์ ์๋ฒฝํ๊ฒ ๊ตฌํํด๋ณผ ์๊ฐ์ด๋ค!
๐ ์ ์ฒด์ฝ๋ https://github.com/DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown
'potato's iOS Story > CloneApp + ์ฝ๋๋ฆฌ๋ทฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CloneApp] (UIKit) toss ์ฑ ํด๋ก ์ฝ๋ฉ - (1) TabBar ๋ง๋ค๊ธฐ (2) | 2022.06.30 |
---|---|
[iOS/Swift] xcode์ SwiftLint ์ค์นํ๊ธฐ (0) | 2022.05.29 |
[iOS] Swift๋ก ์์ฃผ ๊ฐ๋จํ Todo List ๋ง๋ค๊ธฐ (1) (0) | 2022.02.04 |