###### tags: `2020 Boostcamp` # Day14-학습정리 ### 스스로 확인할 사항 - **우리가 구현한 Frame 클래스와 UIView 클래스 동작을 비교해서 정리한다.** - Frame 클래스는 단순히 가상의 뷰를 계층적으로 표현 - UIView - UIResponder를 상속받아 view에서 일어나는 이벤트들을 헨들링함 - UIKit과 Core Graphics를 이용해 컨텐츠를 그림 - Property 들이 새로운 값으로 변할 때 애니매이션 가능 - Frame을 가지고 초기화 ```swift let rect = CGRect(x: 10, y: 10, width: 100, height: 100) let myView = UIView(frame: rect) ``` - UIView의 method 들은 `Main Thread` 에서 호출됨 - **CGAffineTransform에 대해 학습하고, 이것을 Frame에 적용한다면 구현이 달라져야 하는 부분이 어디인가?** - `CGAffineTransform` - 뷰의 프레임을 계산하지 않고 2D 그래픽을 그릴 수 있음 - AffineTransform은 3x3 행렬로 표현됨 - 해당 포인트 (x,y) 에서 행렬곱으로 graphic context에서의 객체들을 그려냄 - 구조체에 있는 함수를 호출해 뷰를 이동(translate), 조절(scale), 회전(rotate) 할 수 있음 ```swift let rect = CGRect(x: 10, y: 10, width: 100, height: 100) let myView = UIView(frame: rect) /// Scale UIView.animate(withDuration: 2.0) { myView.transform = CGAffineTransform(scaleX: 2.0, y: 2.0) } /// Rotation UIView.animate(withDuration: 2.0) { myView.transform = CGAffineTransform(rotationAngle: .pi) } /// Translation UIView.animate(withDuration: 2.0) { myView.transform = CGAffineTransform(translationX: 200, y: 200) } ``` - UpdataLayout 함수에서 원하는 값을 계산하고 Subframe까지 영향을 주게 변화 - Frame을 각도에 따라 그려야 함 (각도 property를 추가하고 이에 맞게 그려야 함) - AutoLayout이 존재한다면 이를 제거하고 적용해야 함 - **구현한 자동 레이아웃에서 충돌이 발생하지 않도록 해결할 수 있는 방법은 무엇인가?** 1. `FrameLayout` 을 추가하여 update할 때, 범위를 벗어나는지 검사 2. 조건이 반복될 때 검사하여 에러 throw 3. 상위 뷰에서부터 update가 일어날 때, 하위 뷰의 AutoLayout constrain이 깨지지 않게 처리 - **구현한 자동 레이아웃과 UIView AutoLayout - NSLayoutConstraint 공통점과 차이점을 정리한다.** - `AutoLayout` 1. 정의 \- 기존의 Frame-Based Layout 또는 Coordinate-Based Layout 과 다르게 View간의 관계를 이용하여 해당되는 View의 위치와 크기를 자동으로 결정하는 Layout System 2. 기존 레이아웃 단점 * 슈퍼뷰의 크기 변화에 대응 어려움 * 기기별 화면 크기 변화에 대응 어려움 * 언어별 문자열 크기 변화에 대응 어려움 - `NSLayoutConstraint` 1. 정의 * constraint-based layout system에서 두 interface object 간에 만족해야 하는 관계 * `item1.attribute1 = multiplier × item2.attribute2 + constant` 2. 기능 * Valid layout은 오로지 하나의 가능한 constraints set으로 정의됨 * constrain들은 equality relationship 뿐만 아니라 다른 비교적인 relationship으로도 정의됨 * constrain간에 우선순위가 존재 ### 다같이 확인할 사항 - **자동 레이아웃을 사용하는 이유과 사용하지 않아도 되는 이유에 대해서 비교하고 토론한다.** - 상위 뷰의 크기 변화에 대응해야 함 - 기기가 horizontal이냐 vertical이냐의 상태에 따라 대응해야 함 - View가 가지고 있는 content 들의 크기 변화에 대응해야 함 - **Frame 클래스를 struct로 구현할 수 있을까? 어떤 제약사항이 있고 그것을 해결할 수 있는 방법이 없는지 찾아보고 토론한다.** - Value type으로 구현하게 되면 재귀적으로 동작하는데 어려움이 있을 수 있음 - 다른 뷰에서 참조해서 사용 할 수 없으므로 변화에 대응하기 어려움