---
# System prepended metadata

title: Day14-학습정리
tags: [2020 Boostcamp]

---

###### 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으로 구현하게 되면 재귀적으로 동작하는데 어려움이 있을 수 있음
  - 다른 뷰에서 참조해서 사용 할 수 없으므로 변화에 대응하기 어려움