Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

potato's iOS Story/CloneApp + ์ฝ”๋“œ๋ฆฌ๋ทฐ

[CloneApp] (UIKit) toss ์•ฑ ํด๋ก ์ฝ”๋”ฉ - (2) Home ํƒญ UI ๋งŒ๋“ค๊ธฐ

๊ฐ์ž ๐Ÿฅ” 2022. 7. 14. 23:17
๋ฐ˜์‘ํ˜•

toss ์•ฑ ํด๋ก ์ฝ”๋”ฉ ๋‘๋ฒˆ์งธ. ํ™ˆ๋ทฐ๋ฅผ ๋งŒ๋“œ๋Š” ์ค‘์ด๋‹ค. ์ด๋ฒˆ์— ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋ชฉํ‘œ๋กœ ์„ธ์› ๋˜ ๊ฒƒ์„ ์ง€ํ‚ค๋ฉด์„œ ๊ณต๋ถ€ํ•˜๋Š๋ผ ์กฐ๊ธˆ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค. ^___^ (๋ฐ”๋ณธ๊ฐ€ ใ… )

์ถœ์ฒ˜ - ์ตœ๊ณ ์‹ฌ

  • ๊ธฐ์ดˆ ๊ฐœ๋…๋„ ๋†“์น˜์ง€ ์•Š๊ณ  ํ™•์‹คํ•˜๊ฒŒ ํ•˜๊ณ  ๋„˜์–ด๊ฐˆ ๊ฒƒ
  • ๊ฐœ๋ฐœ ๊ณผ์ •์„ ๊ธฐ๋กํ•  ๊ฒƒ
  • ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋Š” UI ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ถฉ๋ถ„ํžˆ ๊ณ ๋ฏผํ•˜๊ณ  ๊ตฌํ˜„ํ•  ๊ฒƒ

 


 

๐Ÿ”ต ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋Š” ํ™”๋ฉด

  • 1๋ฒˆํ™”๋ฉด์˜ ์„ ๋ฌผ์ƒ์ž๊ทธ๋ฆผ์€ x ๋ˆ„๋ฅด๋ฉด ์—†์–ด์ง€๋Š” ๊ด‘๊ณ (?)๋ทฐ์ž„
  • ๊ด‘๊ณ ๋ทฐ(?)๊ฐ€ ์—†๋Š” ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•  ์˜ˆ์ •!

 

 

๐Ÿ”ต  'ํ† ์Šค๋ฑ…ํฌ, ์ž์‚ฐ, ์†Œ๋น„' ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผํ• ๊นŒ

๐Ÿ”น UICollectionView๋กœ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ๋งž์„๊นŒ

https://github.com/DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown/pull/7

 

[FEAT] Home ํƒญ collection view ์ƒ์„ฑ by deslog · Pull Request #7 · DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown

๐Ÿ‘พ ๊ด€๋ จ์ด์Šˆ #5 ๐Ÿ‘พ ๊ตฌํ˜„,๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ฐ ์ด์œ  UICollectionView๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์šฐ์„ ์€ 4๊ฐœ์˜ cell์— ํ‹€๋งŒ ์žก์•„๋†“์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๐Ÿ‘พ PR ํฌ์ธํŠธ UIView vs. UICollectionView ๊ฐ™์€ ๋‘ฅ๊ทผ๋ชจ์„œ๋ฆฌ์‚ฌ๊ฐํ˜•

github.com

 

1์ฐจ์ ์œผ๋กœ ๋‚ด๊ฐ€ ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„์ด๋‹ค. ๊ณผ์—ฐ ํ™ˆํƒญ์˜ ๊ฐ€์žฅ ์ดˆ๋ฐ˜ ํ™”๋ฉด์—์„œ 'ํ† ์Šค๋ฑ…ํฌ, ์ž์‚ฐ, ์†Œ๋น„' ์„ธ๊ฐœ์˜ ๋‘ฅ๊ทผ๋ชจ์„œ๋ฆฌ ์‚ฌ๊ฐํ˜• ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฌด์—‡์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผํ• ๊นŒ? ๊ฐ™์€ ๋ชจ์–‘์˜ ์‚ฌ๊ฐํ˜•์ด ์„ธ๋ฒˆ ๋ฐ˜๋ณต๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์ดˆ๋ฐ˜์— collectionView๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์€ ํ™”๋ฉด!
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

 

Apple Developer Documentation

 

developer.apple.com

 

์œ„ ์‚ฌ์ง„์ด stackView๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ธ๋ฐ, distribution์œผ๋กœ ๋ฐฉํ–ฅ(?)์„ ์„ค์ •ํ•ด์ฃผ๊ณ , ๊ทธ ์•ˆ์— ํ•˜๋Š˜์ƒ‰ UI์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ์œผ๋ฉด, ๋™์ผํ•œ spacing ๊ฐ„๊ฒฉ์„ ์ฃผ๋ฉด์„œ ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ๋ณด์—ฌ์ง€๊ฒŒ ํ•ด์ค€๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š”, 'ํ† ์Šค๋ฑ…ํฌ', '์ž์‚ฐ', '์†Œ๋น„' ์„ธ ๊ฐœ์˜ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ๊ฐ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ์ค€ ๋‹ค์Œ, ์„ธ ๊ฐœ๋ฅผ stackview์— ์˜ฌ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ ๋ฐฉ์‹์„ ๋ฐ”๊พธ์—ˆ๋‹ค.

https://github.com/DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown/issues/9

 

[FEAT] Home ํƒญ CollectionView -> UIView๋กœ ๋ณ€๊ฒฝ · Issue #9 · DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown

Describe the feature CollectionView๋กœ ๊ตฌํ˜„ํ•œ homeํƒญ์„ UIView๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค์‹œ ๊ตฌํ˜„ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. CollectionView๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” CollectionView๋Š” Reusableํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌด์ œํ•œ(?)์œผ๋กœ ๋ฐ›์•„์™€์„œ ๋์—†๋Š”

github.com

 


 

๐Ÿ”ต 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์˜ ๋ชจ์Šต

๐Ÿ”น ํ•ด๊ฒฐ ๋ฐฉ์‹

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 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

 

[Error] fatalError("Expected superview but found nil when attempting make constraint `equalToSuperview`.")

์•ฑ์„ ๋งŒ๋“ค๊ณ  ์žˆ๋Š”๋ฐ ๊ฐ‘์ž๊ธฐ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ. ์ธํ„ฐ๋„ท์„ ์ฐพ์•„๋ณด๋‹ˆ๊นŒ addsubView๋ฅผ ์•ˆํ•ด์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ธ๊ฒƒ ๊ฐ™์€๋ฐ, ๋‹ค์‹œ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋ณด๋ฉด์„œ ํ•ด๊ฒฐํ•ด๋ณด์ž. ๋„๋Œ€์ฒด ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ๋‚˜๋Š”๊ฒƒ์ธ๊ฐ€? (์•„

didu-story.tistory.com

 

๊ทธ๋ž˜์„œ ์ง€๊ธˆ๊นŒ์ง€ ์™„๋ฃŒํ•œ ํ™”๋ฉด์€ , ์ด๊ฒƒ

๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฏ๋˜ (์™ผํŽธ์— ์žˆ๋Š”) ์†ก๊ธˆ๊ณผ ๋‚ด์—ญ๋ฒ„ํŠผ๋„ ์ •์ƒ์ ์œผ๋กœ ๋œจ๊ณ , ๋ชจ๋“ ๊ฒŒ ์ผ๋‹จ ํ™”๋ฉด ์•ˆ์œผ๋กœ ๋“ฑ์žฅํ–ˆ๋‹ค. ๋“œ๋””์–ด ^__^

 

๐Ÿ”ต ๋“œ๋””์–ด ์ตœ์ข…

์ด์ œ ์œ„์—์„œ ์ƒ‰์„ ๋‹ค ์—†์• ์ฃผ๊ณ  cornerRadius์ถ”๊ฐ€, ๊ธ€์ž ์œ„์น˜ ์กฐ์ •, ์…€ ๋†’์ด ์ˆ˜์ •, ๋ฒ„ํŠผ ์œ„์น˜๋ณ€๊ฒฝ ๋“ฑ ๋ ˆ์ด์•„์›ƒ์„ ์กฐ๊ธˆ์”ฉ ์†๋ด์ฃผ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ์™„์„ฑํ–ˆ๋‹ค ^___^

 

๋‹ค์Œ์œผ๋กœ ํ•  ์ž‘์—…์€.. ๋ฒ„ํŠผ๋ˆŒ๋ €์„๋•Œ ํ™”๋ฉด์ด๋™ํ•˜๋Š”๊ฑฐ๋ž‘ ๋ถ€๊ฐ€์ ์ธ ๊ฒƒ๋“ค์„ ์ข€ ๊ตฌํ˜„ํ•ด์„œ ํ™ˆํ™”๋ฉด์„ ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณผ ์ƒ๊ฐ์ด๋‹ค!

 

๐Ÿ‘‰ ์ „์ฒด์ฝ”๋“œ https://github.com/DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown

 

GitHub - DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown: ๋ฌธํ™”์„ผํ„ฐ 1๊ธฐ 3๋ฒˆ์งธ Clone App - TOSS

๋ฌธํ™”์„ผํ„ฐ 1๊ธฐ 3๋ฒˆ์งธ Clone App - TOSS. Contribute to DeveloperAcademy-POSTECH/CCC-1st-Toss-Brown development by creating an account on GitHub.

github.com

 

๋ฐ˜์‘ํ˜•