Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발공부 정리 노트

UINavigationController status bar issue 본문

iOS/삽질

UINavigationController status bar issue

Hyunwoo. 2022. 11. 27. 16:24

각 화면 별로 다른 status bar 스타일을 설정하기 위해 preferredStatusBarStyle 속성을 사용하여 스타일을 설정하려고 했지만 변경되지 않는 이슈가 있었습니다.

 

문제는 초기 화면이 네비게이션 컨트롤러에 임베드 되어 있다는 것이었습니다.

 

이 문제에 대한 해답은 애플 공식 문서 TN3105: Customizing the UIKit status bar style에 잘 나와 있습니다.

 

https://developer.apple.com/documentation/technotes/tn3105-customizing-uistatusbar-syle

특정 뷰컨트롤러가 자식 뷰컨트롤러이거나 네비게이션 컨트롤러 스택에 들어 있는 경우에는 부모 뷰컨트롤러나 네비게이션 컨트롤러가 status bar 스타일을 결정합니다. 그래서 자식 뷰컨트롤러에서 status bar 스타일을 설정하도록 하려면 childForStatusBarStyle 속성을 오버라이드해야 합니다.

하단의 코드와 같이 UINavigationController 클래스를 상속받아서 childForStatusBarStyle 속성을 오버라이드해주면 됩니다.

class MyNavigationController: UINavigationController {
    // Return the visible child view controller which determines the status bar style.
    override var childForStatusBarStyle: UIViewController? { return visibleViewController }
}

실습

  • 먼저, 문서에 나와 있는 데로 UINavigationController 클래스를 상속받아 childForStatusBarStyle 속성을 오버라이드해줍니다.
class ViewController: UIViewController {
}

class MyNavigationController: UINavigationController {
    // Return the visible child view controller which determines the status bar style.
    override var childForStatusBarStyle: UIViewController? { return visibleViewController }
}

 

  • 그다음, 화면에 있는 네비게이션 컨트롤러 클래스에 앞에서 만든 네비게이션 컨트롤러를 넣어줍니다.

 

  • 마지막으로 status bar 스타일을 변경할 뷰컨트롤러에서 preferredStatusBarStyle 속성을 이용해 원하는 스타일을 리턴해줍니다.
class SecondViewController: UIViewController {
  
  override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
  }
}

그럼 보기와 같이 정상적으로 status bar 스타일이 변경됩니다.

 

참고자료:

https://developer.apple.com/documentation/technotes/tn3105-customizing-uistatusbar-sylehttps://developer.apple.com/documentation/technotes/tn3105-customizing-uistatusbar-syle

 

Comments