iOS, Swift/Tip, Bug, Swift Error
Swift ) iOS16 네비게이션바 변경사항 - EEYatHo iOS
EEYatHo
2022. 9. 15. 10:24
반응형
배경 설명
아래처럼, 네비게이션바에 커스텀 뷰를 넣는 식으로 사용하고 있었는데
navigationItem.titleView = myCustomView
iOS16 에서 네비게이션바의 UI가 깨졌다.
버튼들이 클릭이 안되고, 가운데로 몰리고, 보이지 않는 경우도 있었다.
가운데로 검색바는 찌그러졌었다.
iOS16 에서 UIKit 이 변경된게 무엇인지 발표하는 WWDC 도 살펴보았고,
iOS16, navigation Bar 기타 등등.. 여러 구글링을 해도 답이 보이지 않았다. ( 이런거나 계속 나오고 -ㅅ- )
삽질 끝에 발견한 현상
iOS16 이전에는,
- titleView 의 부모가 _UINavigationBarContentView 였다.
- _UINavigationBarContentView 는 titleView 와 상관없이, 네비게이션바 전체를 덮고 있다.
- titleView 는 _UINavigationBarContentView 의 center에 배치되었다.
iOS16 에서는,
- titleView와 _UINavigationBarContentView 사이에 _UINavigationBarTitleControl 이 추가되었다.
( titleView 의 부모가 _UINavigationBarTitleControl 로 바뀜 ) - _UINavigationBarTitleControl 는 titleView 에게 달라붙는 constraints를 가지고 있다.
( 기존에 titleView 의 부모는 네비게이션바 전체를 알아서 덮었지만, _UINavigationBarTitleControl 는 오히려 titleView 의 constraints 에 의존함 ) - titleView가 아닌, _UINavigationBarTitleControl 가 _UINavigationBarContentView의 center에 배치된다.
Solution
즉, iOS16 이전에는.
titleView 를 부모에게 달라붙게만 constraints 를 설정하며, UI를 그릴 수 있었다.
하지만 iOS16 에서는,
titleView 의 부모의 width, height 가 titleView 의 크기에 의해 결정되기 때문에,
부모에게 달라붙게만 constraints 를 넣고, width, height가 Ambiguous하면,
titleView 의 부모 (_UINavigationBarTitleControl) 는 width, heigth가 0이 된다. ( 안보인다 )
그래서 intrinsic size 를 가진 커스텀뷰들은 보이긴 하는데 가운데로 찌그러졌던 것이고,
intrinsic size 가 없는 뷰들은 width height 가 0으로 되어 아에 안보이게 된 것이다.
iOS16 부터는 네비게이션바에 넣어주던 커스텀뷰의 width, height를 Ambiguous하지 않게 해야한다.