SnapKit
iOS ์์ Autolayout ์ ์ฝ๋๋ก ๊ตฌํํ ๋ ์ฝ๊ณ ํธ๋ฆฌํ๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์์ฑํด์ผํ๋ ์ฝ๋์ ๊ธธ์ด๋ฅผ ์ค์ฌ์ฃผ๊ณ , ๊ฐ๋ ์ฑ์ ๋์ฌ์ฃผ๋ ์ฅ์ ์ด ์๋ค.
- ๋ทฐ ๊ณ์ธต์ depth ๊ฐ ๊น์ด์ง๋ฉด ๋ณต์กํด์ง ์ ์๋ค.
pure autolayout ์ผ๋ก Autolayout ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ
view.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
let leading = label.leadingAnchor.constraint(equalTo: view.leadingAnchor)
let trailing = label.trailingAnchor.constraint(equalTo: view.trailingAnchor)
let centerX = label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
let centerY = label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
NSLayoutConstraint.activate([leading, trailing, centerX, centerY])
SnapKit ์ ์ด์ฉํด Autolayout ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ
- superview ์ ๋ํ constraint ์ ์ฉ์ ์ฝ๊ฒ ํ ์ ์๋ค.
- translatesAutoresizingMaskIntoConstraints = false ์ค์ ์ ๊ธฐ๋ณธ์ผ๋ก ๋์ด์์ด, ๋ณ๋๋ก ์์ฑํ์ง ์์๋ ๋๋ค.
let label = UILabel()
view.addSubview(label)
label.snp.makeConstraints { make in
make.width.height.centerX.centerY.equalToSuperview()
}โ
SnapKit ๊ตฌ์ฑ ์์ - ์์ฑ, ๋ฉ์๋
view.snp.makeConstraints { make in
make.{properties}.equalTo(...).{methods}
}
โ๏ธ makeConstraints ๋ฉ์๋๋ฅผ ํตํด view ์ ๋ํ constraints ๋ฅผ ์์ฑํ๋ค.
- viewAnchor ์ targetAnchor ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- properties , methods ๋ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ค์ฒฉํด์ ์ฌ์ฉํ ์ ์๋ค.
โ๏ธ properties : constraints ๋ฅผ ์ ์ฉํ ๋์
- left / right / top / bottom / leading / trailing / lastBaseline
- ํฌ๊ธฐ์ ๊ด๋ จ๋ ์์ฑ : size / width / height
- ๊ฐ์ด๋ฐ ์ ๋ ฌ ์์ฑ : centerX / centerY
โ๏ธ eqaulTo(...) : constraints ๋ฅผ ์ ์ฉํ๊ธฐ ์ํ ๊ธฐ์ค์ด ๋๋ ๋์์ ์ค์ ํ๋ ๋ฉ์๋
- equalTo / greaterThanOrEqualTo / lessThanOrEqualTo
- ์์ ๋ฉ์๋๋ค์ ๋ํด eqaulToSuperView() ๋ฑ Super view ์ ์ ์ฉํ ์ ์๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
- make.left.equalTo(view) == make.left.equalTo(view.snp.left)
โ๏ธ methods : constraints ์ ๋ํ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ค์ ํ๋ ๋ฉ์๋
- multipliedBy / dividedBy / offset / inset
- > offset : view ์ constraints ๋ฅผ ์ ์ฉํ view ์์ ๊ฐ๊ฒฉ
- > inset : view ๋ด๋ถ์ ์ฌ๋ฐฑ
- priority : ์ฐ์ ์์ - integer or .low, .medium, .high, .required.
SnapKit - update constraints
constraints ๋ฅผ ์์ฑํ ๋ค์ ์ ๋ฐ์ดํธํ ํ์๊ฐ ์์ ๋, ๊ฐ๋ฅํ ๋ฐฉ๋ฒ๋ค
1 constraint ๋ฅผ ์์ฑํ ๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ ์ฅํ๊ณ , ํ์์ ๋ ํผ๋ฐ์ค๋ฅผ ํตํด ๊ฐ์ ๋ณ๊ฒฝํ๋ค.
2 snp.updateConstraints ๋ฉ์๋๋ฅผ ํตํด constraints ๋ฅผ ์ฌ์ ์ํ๋ค.
- makeConstraints ์ ๋น์ทํ๊ฒ ์์ฑํ์ง๋ง, ์์ ๊ฐ๋ง ์ง์ ํ ์ ์๋ค.
3 snp.remakeConstraints ๋ฉ์๋๋ฅผ ํตํด constraints ๋ฅผ ์ฌ์ ์ํ๋ค.
- makeConstraints ์ ๋น์ทํ์ง๋ง, ๊ธฐ์กด์ constraints ๋ฅผ ์ญ์ ํ ํ ์๋ก ์ค์ ํ๋ค.
Then
- ์ฃผ๋ก UIView ๊ธฐ๋ฐ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์์ฑ ์ค์ ์ ์ข ๋ ํธํ๊ฒ ์ํด ์ฌ์ฉ๋๋ค.
- ์ฝ๋๋ก View ๋ฅผ ์์ฑํ๋ ๊ธฐ์กด ๋ฐฉ๋ฒ์ ๋นํด ๋ฐ๋ณต๋๋ ์ฝ๋๊ฐ ์ ์ด์ง๋ค๋ ์ฅ์ ์ด ์๋ค.
// 1. UILabel ์ธ์คํด์ค๋ฅผ ์์ฑ๊ณผ ์์ฑ ์ค์ ์ ๋ฐ๋ก ์์ฑํ ์ฝ๋
let label = UILabel()
label.textAlignment = .center
label.text = "Hello, World!"
// 2. ํด๋ก์ ๋ฅผ ํตํด UILabel ์ธ์คํด์ค ์์ฑ๊ณผ ์์ฑ์ ์ค์ ํ๋ ์ฝ๋
let label: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.text = "Hello, World!"
return label
}()
// 3. UILabel ์ธ์คํด์ค๋ฅผ ์์ฑํด then + ํด๋ก์ ๋ฅผ ํตํด ์์ฑ์ ์ค์ ํ๋ ์ฝ๋
let label = UILabel().then {
$0.textAlignment = .center
$0.text = "Hello, World!"
}
Then ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ๋ฉ์๋
- then() : ํด๋ก์ ๋ฅผ ํตํด ์ธ์คํด์ค ์์ฑ๊ณผ ํจ๊ป ์์ฑ๊ฐ ์ค์ ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ค.
- with() : ํด๋ก์ ๋ฅผ ํตํด value type ์ ๋ณต์ฌ์ ํจ๊ป ์์ฑ๊ฐ ์ค์ ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ค.
- do() : ํด๋ก์ ๋ฅผ ํตํด ์ธ์คํด์ค์ ๋ฉ์๋ ๋์์ด ์ํ ๊ฐ๋ฅํ๋๋ก ํ๋ค.
์ฐธ๊ณ ๋ฌธ์
'๐ iOS > WWDC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[WWDC18] iOS Memory Deep Dive (2) | 2022.11.27 |
---|---|
[WWDC19] Advances in Collection View Layout - Part 1 (0) | 2022.10.17 |
[WWDC19] Data Flow Through SwiftUI - Part 2 (0) | 2022.08.30 |
[WWDC19] Data Flow Through SwiftUI - Part 1 (0) | 2022.08.30 |
[WWDC19] LLDB: Beyond "po" (0) | 2022.07.04 |