|
| 1 | +# TIL |
| 2 | + |
| 3 | +## 배운 것 |
| 4 | + |
| 5 | +* 배운 내용 정리하는 시간 |
| 6 | + |
| 7 | +* PropertyObserver - didSet / willSet |
| 8 | + |
| 9 | + tableView.reloadData() 항상 데이터가 변경될 때마다 해주어야 함 |
| 10 | + |
| 11 | + ```swift |
| 12 | + var list = TravelInfo.travel { |
| 13 | + didSet { |
| 14 | + contentsTableView.reloadData() |
| 15 | + } |
| 16 | + } |
| 17 | + ``` |
| 18 | + |
| 19 | + didSet, willSet으로 값이 변경될 때마다 해야 할 일을 정의할 수 있음 |
| 20 | + |
| 21 | + didSet - newValue, willSet - oldValue |
| 22 | + |
| 23 | + didSet은 값이 변경되었을 때, willSet은 값이 변경되기 직전에 호출 |
| 24 | + |
| 25 | +* automatic height 설정 |
| 26 | + |
| 27 | + label의 numberoflines = 0인가? |
| 28 | + |
| 29 | + layout이 기준으로 잘 잡혀 있는가? |
| 30 | + |
| 31 | + tableView.rowHeight = UITableView.automaticDimension으로 되어있는가? |
| 32 | + |
| 33 | +* protocol + extension |
| 34 | + |
| 35 | + ```swift |
| 36 | + protocol ReuseIdentifierProtocol { |
| 37 | + static var identifier : String { get } |
| 38 | + } |
| 39 | + |
| 40 | + extension UIViewController : ReuseIdentifierProtocol{ |
| 41 | + static var identifier: String { |
| 42 | + return String(describing: self) |
| 43 | + } |
| 44 | + } |
| 45 | + ``` |
| 46 | + |
| 47 | + protocol로 구현을 강제하고 extrnsion에서 타입 프로퍼티(static var) 로 선언하면 UIViewController.identifier -> identifier와 같이 사용할 수 있다 |
| 48 | + |
| 49 | + 여기서 String(describing: self)는 자기자신의 이름을 리턴함 |
| 50 | + |
| 51 | +* clipToBounds, masksToBounds |
| 52 | + |
| 53 | + cliptoBounds는 모서리에 대한 처리를 할 때 거의 항상 따라다님 |
| 54 | + |
| 55 | + cornerRadius는 모서리에 코너를 깎는 개념(clipToBound) |
| 56 | + |
| 57 | + 몇 가지 뷰 객체는 clipToBound가 디폴트로 설정, label은 안되어 있음 |
| 58 | + |
| 59 | + radius를 그릴때 모서리를 깎고 갖다 버리는 행위와 같음 |
| 60 | + |
| 61 | + clipToBounds > 잘라내서 바깥을 버리는 행위와 같음 |
| 62 | + |
| 63 | + 그림자를 주면서 cornerRadius를 준다 > 불가능(shadow는 바깥에 그려짐..) |
| 64 | + |
| 65 | + cornerRadius 줄 때 clipToBound랑 세트로 써주면 좋다. |
| 66 | + |
| 67 | + clipToBounds |
| 68 | + |
| 69 | + UIView 소속 |
| 70 | + |
| 71 | + - true : 내 영역(Super View) 이외 영역의 Sub View는 Draw 하지 않는다 |
| 72 | + - false : 내 영역(Super View) 이외 영역의 Sub View도 Draw 한다 |
| 73 | + |
| 74 | + |
| 75 | + maskToBounds |
| 76 | + |
| 77 | + CALayer 소속 |
| 78 | + - 모든 UIView 인스턴스는 기본적으로 하나의 CALayer 인스턴스를 가지고 있음 |
| 79 | + - 시각적인 역할을 담당하는 오브젝트 ( 콘텐츠 캐싱, 애니메이션 성능 서포트 등) |
| 80 | + - 가급적 View 속성 대신 Layer 속성을 변경하는 것을 피하라고 추천함(결과가 잘못될 수 있다) |
| 81 | + |
| 82 | + - Sub Layer가 내 Layer를 넘어선 경우, 내 Layer 너머로 그릴 것인지 말 것인지 한계를 설정 |
| 83 | + - coreAnimation이 레이어의 경계와 일치하고 모서리 반지름 효과를 포함하는 암시적 클리핑 마스크를 만듬(틀 같은 느낌) > 마스크 속성의 값도 지정하면 두 마스크가 합쳐져서 최종 마스크 값을 얻게 됨 |
| 84 | + |
| 85 | + clipToBounds: bound기준으로 범위를 넘는 서브뷰를 자를지 말지 |
| 86 | + |
| 87 | + maskToBounds: 레이어를 합쳐서 최종마스크를 얻는데 layer를 넘어서는 부분을 그릴지 말지 |
| 88 | + |
| 89 | +* maskedCorners |
| 90 | + |
| 91 | + ```swift |
| 92 | + posterImageView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMaxYCorner] |
| 93 | + ``` |
| 94 | + |
| 95 | + cornerRadius를 줄 모서리 설정함(x, y기준) |
| 96 | + |
| 97 | + |
| 98 | +## 생각해 볼 것 |
| 99 | + |
| 100 | +태그는 고유하지 않아도 된다. 구분하기 위해 고유하게 사용하는 것 뿐이다. default 는 0을 가짐 |
| 101 | + |
| 102 | +리팩토링 하는 것 필요. 특히 extension이랑 protocol을 함께 사용하는 것은 해보지 않아서 많이 해보면서 익혀야 함 |
| 103 | + |
| 104 | + |
| 105 | +수업을 들으면서 차근차근 단계별로 수정하는 것의 중요성을 느끼게 되었다. |
| 106 | + |
| 107 | + |
0 commit comments