Constraint는 뷰와 뷰 사이의 관계를 정의한다
var myConstraints: [NSLayoutConstraints] = []
override func updateConstraints() {
// 불필요하게 모든 constraints를 deactivate/activate 하지않도록 한 번 이상은 작업을 수행하지 않도록한다.
if myConstraints.isEmpty {
NSLayoutConstraint.deactivate(myConstraints)
myConstraints.removeAll()
let views = ["text1":text1, "text2":text2]
myConstraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|-[text1]-[text2]",
options: [.alignAllFirstBaseline],
metrics: nil, views: views)
myConstraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-[text1]-|",
options: [],
metrics: nil, views: views)
NSLayoutConstraint.activate(myConstraints)
}
super.updateConstraints()
}
위는 이거랑 같은 짓이다
이렇게 고쳐라. 한 번만 하자!
Each scene in your app’s UI contains a window object and one or more view objects. The window serves as an invisible container for the rest of your UI, acts as a top-level container for your views, and routes events to them. The views provide the actual content that users see onscreen, drawing text, images, and other types of custom content. Windows are long-lived objects, and you dismiss them only when tearing down your scene’s entire UI. By contrast, you might change the views in that window frequently, particularly when you want to display new content or information.
Window는 rootViewController로 대변될 수 있는 최상단의 뷰라고 생각하면 된다. 한마디로 요약하면 View hierarchy의 최상단에 있는 객체인 것. 윈도우는 눈에 보이는 바로 그 '화면'이고 뷰들은 그 안에 옹기종기 모여 사는 주민인 셈이다.
따라서 유일한 윈도우 아래에는 많은 수의 View들이 존재할 수있으며 UIKit은 UIViewController
라는 객체를 통해 윈도우와 소통하며 이들을 제어할 수 있게 도와준다.
원래는 AppDelegate에서 윈도우를 만들어줬지만 아이패드를 위시한 다중화면 기능이 등장하면서 SceneDelegate에서 여러개의 윈도우를 만들 수 있게 되었다.
위 글에 보면 잘 설명이 되어있는데 Bound는 뷰 내부의 좌표계 중 어느 부분에서 시작할지를 고르는 것, Frame은 뷰 외부(super view)의 좌표계 중 어느 부분에서 시작할지를 고르는 것이다. 크기는 뭐 같은 뜻이다. 말로하면 잘 안 와닿는데 위 블로그에서 사진 설명 보면 바로 이해 된다.
Frame이 변한다고 bound가 변하지 않는다.
setNeedsLayout()
이다. setBounds
나 setCenter
등의 메소드로 서브뷰를 다시 레이아웃 시킴.