ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐ŸŽ iOS/๐Ÿ Swift

[Swift] AutoLayout, ScrollView

๊ตฌ๋„ˆ์ • 2022. 10. 12. 16:08

AutoLayout ์ด๋ž€?

์ œ์•ฝ ์กฐ๊ฑด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ ์œผ๋กœ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•

- ๋””๋ฐ”์ด์Šค์˜ view ์‚ฌ์ด์ฆˆ์— ๋”ฐ๋ผ ์ œ์•ฝ์กฐ๊ฑด์— ๋งž๊ฒŒ ์œ„์น˜์™€ ์‚ฌ์ด์ฆˆ๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ ˆ

- ์–ด๋А ๋””๋ฐ”์ด์Šค์—์„œ๋“ ์ง€ ๊ฐ™์€ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง€๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

View์˜ ์†์„ฑ

1. ์œ„์น˜ ์†์„ฑ - CenterX, Leading, Trailing, CenterY, Top, Bottom

2. ํฌ๊ธฐ ์†์„ฑ - Width, Height

- ๊ณ ์ •๋˜์–ด ์žˆ๋Š” ์ ˆ๋Œ€๊ฐ’์ด ์•„๋‹Œ, ์กฐ๊ฑด(contraints)์„ ์„ค์ •

 

    private func layout() {
        view.addSubview(firstView)
        view.addSubview(secondView)
        view.addSubview(thirdView)
        view.addSubview(fourthView)
        view.addSubview(fifthView)
        
        // 1
        firstView.snp.makeConstraints { make in 
            make.top.equalTo(self.view.safeAreaLayoutGuide).offset(149)
            make.leading.trailing.equalTo(self.view.safeAreaLayoutGuide).inset(70)
            make.height.equalTo(152)
        }
        
        // 2
        secondView.snp.makeConstraints { make in
            make.top.equalTo(firstView.snp.bottom).offset(23)
            make.leading.equalTo(self.view.safeAreaLayoutGuide).inset(70)
            make.height.equalTo(152)
            make.width.equalTo(115)
        }
        
        // 3
        thirdView.snp.makeConstraints { make in
            make.top.equalTo(firstView.snp.bottom).offset(23)
            make.leading.equalTo(secondView.snp.trailing).offset(5)
            make.trailing.equalTo(self.view.safeAreaLayoutGuide).inset(70)
            make.height.equalTo(32)
        }
        
        // 4
        fourthView.snp.makeConstraints { make in
            make.top.equalTo(thirdView.snp.bottom).offset(5)
            make.leading.equalTo(secondView.snp.trailing).offset(5)
            make.trailing.equalTo(self.view.safeAreaLayoutGuide).inset(70)
            make.height.equalTo(32)
        }
        
        // 5
        fifthView.snp.makeConstraints { make in
            make.top.equalTo(fourthView.snp.bottom).offset(5)
            make.leading.equalTo(secondView.snp.trailing).offset(5)
            make.trailing.equalTo(self.view.safeAreaLayoutGuide).inset(70)
            make.height.equalTo(76)
        }
    }

- ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ๋ทฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

 

Safe Area

- ์•ˆ์ „ํ•˜๊ฒŒ ์ปจํ…์ธ ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ

- ํ™”๋ฉด์„ ๊ฐ€๋“ ์ฑ„์›Œ์•ผ ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ Safe Area๋ฅผ ์‚ฌ์šฉํ•ด ๋ ˆ์ด์•„์›ƒ ์žก๋Š” ๊ฒƒ์ด ๋ณดํŽธ์ 

iPhone 14์˜ safe area

UIScrollView

- ์ž์ฒด์ ์œผ๋กœ ๊ฐ€์ง€๋Š” ์ปจํ…์ธ ์˜ ์Šคํฌ๋กค ๋ฐ ํ™•๋Œ€/์ถ•์†Œ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ทฐ

- ์ƒํ•˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ขŒ์šฐ๋กœ๋„ ๊ฐ€๋Šฅ

- ์ปจํ…์ธ ์˜ ๊ธธ์ด๊ฐ€ ํ™”๋ฉด๋ณด๋‹ค ๊ธธ๊ฑฐ๋‚˜ ํด ๊ฒฝ์šฐ ์Šคํฌ๋กค ๋™์ž‘ ๊ฐ€๋Šฅ, ์ปจํ…์ธ  ๊ธธ์ด๊ฐ€ ์ž‘์„ ๋•Œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Œ

 

AutoLayout in ScrollView

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        view.addSubview(containerView)
        containerView.addSubview(firstView)
        containerView.addSubview(secondView)
        containerView.addSubview(thirdView)
        
        containerView.snp.makeConstraints { make in
            make.edges.equalTo(self.view.safeAreaLayoutGuide) // scroll view ๋‹ค ์œ„์•„๋ž˜ ๋ฐ€์ฐฉ
        }
        
        firstView.snp.makeConstraints { make in
            make.top.equalToSuperview()
            make.leading.trailing.equalTo(self.view.safeAreaLayoutGuide)
            make.height.equalTo(337)
        }
        
        secondView.snp.makeConstraints { make in
            make.top.equalTo(firstView.snp.bottom).offset(45)
            make.leading.trailing.equalTo(self.view.safeAreaLayoutGuide)
            make.height.equalTo(337)
        }
        
        thirdView.snp.makeConstraints { make in
            make.top.equalTo(secondView.snp.bottom).offset(45)
            make.leading.trailing.equalTo(self.view.safeAreaLayoutGuide)
            make.height.equalTo(337)
            make.bottom.equalToSuperview().offset(-45)
        }
    }

- ์œ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ „์ฒด ์ฝ”๋“œ

 

        containerView.snp.makeConstraints { make in
            make.edges.equalTo(self.view.safeAreaLayoutGuide) // scroll view ๋‹ค ์œ„์•„๋ž˜ ๋ฐ€์ฐฉ
        }

- ScrollView๋ฅผ safe area ์ „์ฒด์— ๋ฐ€์ฐฉ

 

        thirdView.snp.makeConstraints { make in
            make.top.equalTo(secondView.snp.bottom).offset(45)
            make.leading.trailing.equalTo(self.view.safeAreaLayoutGuide) // ?
            make.height.equalTo(337)
            make.bottom.equalToSuperview().offset(-45) // ํ•˜๋‹จ ์ œ์•ฝ
        }

- leading๊ณผ trailing์„ ์Šคํฌ๋กค๋ทฐ๊ฐ€ ์•„๋‹Œ safe area์— ๋งž์ถ”๋Š” ์ด์œ ?

- ๋งˆ์ง€๋ง‰ ์ปดํฌ๋„ŒํŠธ๋Š” ์Šคํฌ๋กค๋ทฐ์™€์˜ ํ•˜๋‹จ ์ œ์•ฝ์„ ๊ผญ ์ฃผ์–ด์•ผ ํ•จ

 

 

Comments