(iOS) - AutoLayout ,Constraint, intrinsic size
- -
Auto Layout
์ ์
iPhone 4 ๋ถํฐ iPhone 11, iPhone SE, iPhone XS ๊ทธ๋ฆฌ๊ณ iPhone XS MAX ๋ฑ ๋ชจ๋ ํฌ๊ธฐ๋ ๋น์จ์ด ์ ๊ฐ๊ฐ์ธ ๋๋ฐ์ด์ค๋ค์ด ์กด์ฌํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋๋ฐ์ด์ค ์ฌ์ด์ฆ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ๋์ผํ ํ๋ฉด์ ๊ตฌ์ฑํ ํ์๊ฐ ์๋๋ฐ, ์ด๋ฅผ ์ํด ๋์จ ๊ฒ์ด ์คํ ๋ ์ด์์(Auto Layout) ์ธ๋ฐ, ์ ์ฝ์ ์ถ๊ฐํ๋ฉด ๋ ์ด์์ ์์คํ ์ด ๋๋ฐ์ด์ค ๊ทธ๋ฆฌ๊ณ ํด์๋๋ฅผ ๊ณ ๋ คํ์ฌ ์ต์ข ์์น์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๊ณ ๋ฐฐ์น์์น๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์์ด๋ค. ์ฆ , View๋ค๊ณผ์ ๊ด๊ณ(์ ์ฝ)๋ฅผ ์ด์ฉํ์ฌ View์ ์์น์ ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ฒฐ์ ํด์ฃผ๋ ์์คํ ์ด๋ค.
์คํ ๋ ์ด์ด์์์ ์ฌ์ฉํ๋ ์ด์ ์๋ ๋๋ฐ์ด์ค์ ๋ค์์ฑ ์ด์ธ์๋ ๋๊ฐ์ง ์์ธ์ด ์กด์ฌํ๋ค.
์ธ๋ถ ๋ณ๊ฒฝ
์ธ๋ถ ๋ณ๊ฒฝ์ ์ํผ๋ทฐ์ ํฌ๊ธฐ๋ ๋ชจ์์ด ๋ณ๊ฒฝ๋ ๋ ๋ฐ์ํฉ๋๋ค. ๋ณดํต ๋๋ฐ์ด์ค๋ฅผ ํ์ ํ๊ฑฐ๋, ๋ค๋ฅธ ํฌ๊ธฐ์ ํด๋์ค๋ ์คํฌ๋ฆฐ์ ์ง์ํ๊ฑฐ๋, ์์ดํจ๋์์ ๋ถํ ๋ทฐ(split view) ๋ฅผ ์ฌ์ฉํ ๋
๋ด๋ถ ๋ณ๊ฒฝ
๋ด๋ถ ๋ณ๊ฒฝ์ ์ธํฐํ์ด์ค ๋ทฐ์ ํฌ๊ธฐ๋ ์ค์ ์ด ๋ณ๊ฒฝ๋ ๋ ๋ฐ์ํ๋ค. ๋ณดํต ์ดํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ธ ๊ฐ ๋ณ๊ฒฝ, ๊ตญ์ ํ๋ฅผ ์ง์, ๋์ ์ธ ํ์ ์ ์ง์ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ์ ๋ฌธ ๊ธฐ์ฌ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์ด๋ฏธ์ง๋ ํ ์คํธ๋ฅผ ์ ๋ฌธ ๊ธฐ์ฌ์ ๋ ์ด์์์ ๋ง๊ฒ ์กฐ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ก๋ค ์ ์๋ค.
Auto Layout ์ด์ ์ ์ฐ์ด๋ Frame-based Layout์์๋ UIView.frame.size.width
์ ๊ฐ์ด frame์ ์ ๊ทผํ์ฌ ์์ฑ์ ๋ค๋ค์ผํ๋ค.
์ผ์ชฝ ๊ทธ๋ฆผ์ ์์ ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ธ Frame-based Layout์ด๋ค.View๋ฅผ ๋ฐฐ์นํ ์์น๋ฅผ ์ง์ ํ๊ณ , View์ ๋๋น์ ๋์ด๋ฅผ 100ํฌ์ธํธ๋ก ์ง์ ํด์ผํ๋ค.
๋ฐ๋ช Auto layout์์๋ ์ผ์ชฝ, ์๋จ ์ฌ๋ฐฑ์ 50ํฌ์ธํธ๋ก ์ง์ ํ๊ณ , ๋๋น์ ๋์ด๋ฅผ 100์ผ๋ก ๊ณ ์ ํ๋ ์ ์ฝ์ ์ถ๊ฐํ๋ค.
์ผํ๋ณด๋ฉด ๋น์ทํ์ง๋ง, ํฐ ์ฐจ์ด์ ์ด ์กด์ฌํ๋ค???
์คํ ๋ ์ด์์์ ์ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก view๋ฅผ ๋ฐฐ์นํ๋ฏ๋ก, ๊ฐ์ฅ ์ค์ํ ๊ฐ๋ ์ด๋ค.
Auto Layout Interface Builder
Prototype Constraint
์คํ ๋ฆฌ๋ณด๋์์์ ๋๋๊ทธ๋ฅผ ํตํด view๋ฅผ ๋ฐฐ์นํ๊ฒ ๋๋ฉด ,์คํ ๋ฆฌ๋ณด๋ ์์ ํ์ฌ ํ๋ ์์ ๋ง์ถ์ด ์๋์ผ๋ก ์ ์ฝ์ด ์ถ๊ฐ๋๋ค. ์ด๊ฒ์ ํ๋กํ ํ์ ์ ์ฝ์ด๋ผ๊ณ ํ๋ค. (์์๋ฐฉํธ๋๋)
PreView
Option + Command + enter
runningํ์ง ์๊ณ , ํ๋ฒ์ ๋ค์ํ ๋๋ฐ์ด์ค์์์ ์ ์ฝ์ ํ์ธํ ์ ์๋ค.
Constarints ๊ณต์
AutoLayout์ ์ ํ ๋ฐฉ์ ์์ ์ํด ๊ณ์ฐ์ด ๋๋ค. ๋ค๋ฅธ View๋ค๊ณผ์ ๊ด๊ณ(์ ์ฝ)์ ํตํด View์ ์์น๋ฅผ ๊ฒฐ์ ์ง๋ ์์คํ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ค๋ชจ๋ ๋ฐ์ค(uiView๋ก ๋ง๋ฌ)๋ฅผ ํ๋ ๋ง๋ค๊ณ , ์๋ฅผ๋ค๋ฉด
- redBox.top = 1.0 * SafeArea.top + 100
- redBox์ top์ safeArea์ top๊ณผ 100์ ๊ฑฐ๋ฆฌ์ ์๋ค.
- redBox.leading = 1.0 * SafeArea.leading + 50
- redBox์ leading์ safeArea์ leading๊ณผ 50์ ์๋ค.
- ์ ์ฝ์ ์ถ๊ฐํ๊ฒ๋๋ฉด ๊ฐ์ฅ ์ธ์ ํ ๊ณตํต๋ทฐ์ ์ถ๊ฐ๋๋ค. ๋ฐ๋ผ์ ์์ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ์ธ์ ํ ๊ณตํต๋ทฐ๋ rootView์ด๋ฏ๋ก rootView์ ์ถ๊ฐ๋๋ค.
Realation
=๊ฐ ์๋ <=, >=๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ๊ฐ์ฅ ์ฌ์ด ์๋ฅผ ๋ค๋ฉด, Label์ ์ฌ์ฉํ๋๋ฐ ํ ์คํธ์ ํฌ๊ธฐ๊ฐ ๊ธด ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ๋ฉด ๋๋ค.
redBox์ Label ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฑํธ๋ก ๋์์๋๋ ํ ์คํธ๊ฐ ๊ธธ์ด์ ์๋ฆฌ์ง๋ง, <=๋ฅผ ํตํด ๊ฑฐ๋ฆฌ๊ฐ ๋ ๊ฐ๊น์์ ธ๋ ๋๋๋ก ์ค์ ํด๋์ผ๋ฉด ํ ์คํธ์ ๋ง์ถฐ Label์ด ์ด๋ํ๋ค.
Priority
1 ~ 1000์ ๊ฐ์ด๋ค. ์ค๋ณต๋๋ constraint๊ฐ ์์ ๊ฒฝ์ฐ์, ์ด๋ค ๊ฐ์ผ๋ก ์ฒ๋ฆฌํ ์ง๋ฅผ ์ฐ์ ์์๋ก ์ง์ ํ๋๊ฒ์ด๋ค.
1000 = ํ์์ ์ฝ์ด๊ณ , ๋ ๋ฎ์ผ๋ฉด ์ต์ ์ ์ฝ์ด๋ค. ์ ๋งคํ ๊ฐ๋ณด๋ค๋ ๋์ ๋ฒ์๋ก ์ฌ์ฉํ๋๊ฒ ์ข๋ค.
ex ) ํ์(1000) , ๋์(750), ์ค๊ฐ(500), ๋ฎ์(250)
์๋ก ์ถฉ๋ํ๊ณ , ์ฐ์ ์์๋ ๊ฐ๋ค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ๋๋ค.
์ฐ์ ์์๋ฅผ 999๋ก ๋์ผ๋ฉด, Document Outline ์์๋ @999 ๋ก ํ์๋๋ค.
์ฝ๋๋ก Priority ๋ฐ๊พธ๊ธฐ
class ViewController: UIVIewController{
@IBOutlet weak var reboxHeight: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
if redboxHeight.priority.rawValue == 1000{
// ๊ฐ์ ํ์ธํ ๋๋ rawValue ์์ฑ ์ด์ฉ
redboxHeight.priority = UILayoutPriority(999)
}
}
}
Intrinsic Content size (๊ณ ์ ์ฝํ ์ธ ํฌ๊ธฐ)
๊ฐ๋จํ ๋งํ๋ฉด AutoLayout์ constarint๋ฅผ ํ์ธํ ๋, width ์ Height์ ๋จผ์ ํ์ธํ๋ค. ์ด๋ Width, Height์ ๋ํ ์ ์ฝ์ด ์๋ค๋ฉด ์ฒซ๋ฒ์งธ๋ก ๋๋จธ์ง ์ ์ฝ๋ค๋ก size๋ฅผ ์ถ๋ก ํ ์ ์๋์ง ํ์ธํ๋ค.
๊ทธ๋๋ size๋ฅผ ์ถ๋ก ํ ์ ์๋ค๋ฉด,View๊ฐ ์ถ๋ ฅํ๋ ค๋ ์ฝํ ์ธ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ค.์ด๊ฒ์ด Intrinsic Content Size์ด๋ค. ์ ๋นํ ํฌ๊ธฐ๋ฅผ ์ป๋๋ค๋ฉด ์ถ๋ ฅํ๊ณ , ์๋๋ผ๋ฉด ์ ์ฝ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
Intrinsic Content Size๋ฅผ ํ์ฉํ๋ View๋ค
- UILabel : ํ ์คํธ์ ํฐํธ, ์ฌ์ด์ฆ๋ฅผ ํตํด Intrinsic size๋ฅผ ๊ตฌํ๋ค. ๋ ์ด๋ธ์ ์คํ๋ ค width, height์ ๊ณ ์ ํ๋๊ฒ์ด ํผํด์ผํ ํจํด์ค์ ํ๋์ด๋ค.
- UIButton : ๋ฒํผ๋ Label๊ณผ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ์ฐจ์ด์ ์ ํฐ์น๊ฐ์ง๋ฅผ ์ํด Label๋ณด๋ค๋ ์ฝ๊ฐ์ ํจ๋ฉ์ด ๋ถ์ฌ์ ธ Intrinsic size๊ฐ ์์ฑ๋๋ค.
- UISwitch : ํญ์ ๊ณ ์ ๋ ํฌ๊ธฐ๋ก ํ์๋๊ธฐ ๋๋ฌธ์ ํญ์ Intrinsic size๋ก ์ถ๋ ฅ๋๋ค.
- UITextField: ํญ์ ์ ๋ ฅ์ ๋ฌธ์ ๊ฐ ์์์ ๋์ Width๋ฅผ ์ถ๊ฐํด์ฃผ๋๊ฒ ์ข๋ค.
์ด๋ฌํ Intrinsic Content๋ฅผ ์จ์ ํ๊ฒ ๋ํ๋๊ฒ ํ๊ธฐ ์ํ ์ฐ์ ์์๊ฐ 2๊ฐ์ง ์๋ค.
Hugging priority
- ์ฐ์ ์์๊ฐ ๋์ผ๋ฉด ํฌ๊ธฐ๋ฅผ ์ ์งํจ.
- ์ฐ์ ์์๊ฐ ๋ฎ์ผ๋ฉด ํฌ๊ธฐ๊ฐ ๋์ด๋๋ค.
- ๋ ์ค๋ธ์ ํธ์ค ํ๋๊ฐ ์ปค์ ธ์ผ ํ๋ ์ํฉ์์ ์ฌ์ฉํ๋ค.
Compression Resistance priority
- ์ฐ์ ์์๊ฐ ๋์ผ๋ฉด ํฌ๊ธฐ๋ฅผ ์ ์งํจ.
- ์ฐ์ ์์๊ฐ ๋ฎ์ผ๋ฉด ํฌ๊ธฐ๊ฐ ์์์ง๋ค.
- ๋ ์ค๋ธ์ ํธ์ค ํ๋๊ฐ ์์์ ธ์ผ ํ๋ ์ํฉ์ ์ฌ์ฉํ๋ค.
'๐ฑ iOS > -- UIKit' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(iOS) - info.plist & appProject ( .xcodeproj ) (2) | 2021.09.09 |
---|---|
(iOS) - Bundle : Build version์ Version์ ์ฐจ์ด์ ๊ฐ๋ (0) | 2021.09.08 |
(iOS) - App Life Cycle, App Delegate, Scene Delegate (0) | 2021.09.05 |
(iOS) - WebView : Safari ํธ์ถ , WKWebView , SFSafariViewController (In app Browser) (0) | 2021.08.20 |
(iOS) ๋คํธ์ํฌ ํต์ , RESTful API , SOAP , JSON , XML (0) | 2021.08.05 |
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค