먼저 앱에는 흰색같은 밝은 색의 배경색을 갖을 수도, 검은색같은 어두운 색의 배경색을 갖을 수도 있다. 그래서 현재 화면에 맞게 상태바의 색상을 바꿔주어야 한다.
아래 링크는 애플에서 제공하는 Human Interface Guideline에 나와있는 상태바의 대한 이야기이다.
간단하게 이야기해보면, 상태바는 시스템에서 제공하는 것을 그대로 사용하고 커스텀하지말라고한다.. 또, 필요에 따라 상태바를 숨겼다가 나타나게 하는 것도 가능하다. (ex.앨범) 진짜 짧은 1페이지 글이니깐 보는 것을 추천합니다!!
Apple HIG - StatusBar
그래서 무엇을 하려고하는거냐면..
사실 NavigationController를 사용한 상태에서 네비바의 색상이 부모 뷰는 어둡고 자식 뷰는 밝다고했을 경우에 상태바의 색상도 바꿔보려고 했다. 근데.. 일반적인 상황에서는 부모 뷰의 네비바 색상과 자식 뷰의 네비바 색상을 동일하게 가져가는 것이 베스트인 것 같다. 왜냐하면, NavigationBar의 barStyle에 따라 일반적으로 상태바의 색상을 자동적으로 결정한다고 한다.
ViewController에서 상태바의 색상을 변경하기 위해서 많이 사용하는
override var preferredStatusBarStyle: UIStatusBarStyle {
return .default
}
코드가 NavigationController에서는 호출되지 않는다.
찾아보니 childForStatusBarStyle
프로퍼티를 사용하면 preferredStatusBarStyle
이 호출되어서 색상을 변경 할 수도 있다고 하는데... 어떤 이유에서인지 몰라도 해당 방법으로는 해결하지 못했다.
self.navigationController?.navigationBar.barStyle = .default
이런 식으로 ViewWillAppear에서 호출해보기도 했지만 이것 또한 잘 동작하지는 않았다.
위 이미지의 값도 Yes로 변경해서 상태바를 VC의 기준으로 변경하도록 했는데도 위의 방식들이 잘 동작하지 않았다ㅠ
statusBarStyle이 iOS 13부터 deprecated 된 방식이라고는 하지만
// 검은색으로
UIApplication.shared.statusBarStyle = .default
// 흰색으로
UIApplication.shared.statusBarStyle = .lightContent
방식이 그나마 잘 적용되었다. 하지만 deprecated 된 방식으로 위의 prefferedStatusBarStyle 방식을 사용하라고는 하지만 일단은 더 찾아보고 공부해봐야지 제대로 된 NavigationController에서 상태바 색상 변경하는 법을 찾아낼 수 있을 것 같다.
나중에 진짜 정석의 방법을 찾게 된다면 밑에 추가로 글을 더 작성하도록 해야겠다!
적용했던 방식들 중에서 NavigationController를 사용하는 경우를 추가해보려고 한다!! (제가 적용해서 상태바 + 상태바 아이콘 색상까지 변경했습니다~!)
UINavigationController에 childForStatusBarStyle
메서드를 오버라이딩해주고 return하는 값으로 topViewController
나 visibleViewController
를 해주면 된다.
topViewController : 해당 네비게이션 스택에서의 최상단의 뷰
visibleViewController : 화면에 보이는 뷰
그럼 Return되는 값을 기준으로 각 viewcontroller에서 오버라이딩 된 preferredStatusBarStyle
의 리턴 값에 따라 상태바 및 상태바 아이콘의 색상이 변경된다!!