EEYatHo 앱 깎는 이야기

Swift ) iOS16 네비게이션바 변경사항 - EEYatHo iOS 본문

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 이전에는,

  1. titleView 의 부모가 _UINavigationBarContentView 였다.
  2. _UINavigationBarContentView 는 titleView 와 상관없이, 네비게이션바 전체를 덮고 있다.
  3. titleView 는 _UINavigationBarContentView 의 center에 배치되었다.

 

 

iOS16 에서는, 

  1. titleView와 _UINavigationBarContentView 사이에 _UINavigationBarTitleControl 이 추가되었다.
    ( titleView 의 부모가 _UINavigationBarTitleControl 로 바뀜 )

  2. _UINavigationBarTitleControl 는 titleView 에게 달라붙는 constraints를 가지고 있다.
    ( 기존에 titleView 의 부모는 네비게이션바 전체를 알아서 덮었지만, _UINavigationBarTitleControl 는 오히려 titleView 의 constraints 에 의존함 )

  3. 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하지 않게 해야한다.

Comments