티스토리 뷰

iOS

iOS status bar style 변경하기

경표다 2021. 11. 18. 02:27

status bar style을 코드로(programmatically..) 변경하는 방법!

아래와 같은 코드의 뷰컨트롤러가 있을 때

final class MainViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setUpUI()
    }

    private func setUpUI() {
        view.backgroundColor = .systemBackground
    }

}
라이트모드 다크모드

이렇게 디바이스 디스플레이 모드가 라이트 모드일때 검정색, 다크모드일때 흰색으로 보인다.
단, Info.plist로 statusBarStyle 관련 설정을 해주지 않았을때..


그리고 여기서 현재 statusBarStyle을 커스텀 지정해주고 싶다면

final class MainViewController: UIViewController {
    ...
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    ...
}

이렇게 preferredStatusBarStyle 을 override 하여 지정해주면 된다.

라이트모드 다크모드

.default 는 디스플레이 모드에 따라감
.lightContent 는 흰색
.darkContent 는 검정색



그.런.데.

뷰 컨트롤러가 NavigationController, 즉 네비게이션 안에 있을 때는 단순히 preferredStatusBarStyle을 오버라이드 하는 것으론 해결되지 않는다.


preferredStatusBarStyle이 적용되지 않아서 다시 검정색으로 보임..
이렇게 똑같이 preferredStatusBarStyle을 지정해줘도 UINavigationController에 embed 되어있다면 적용되지 않는다..

참고로 탭(UITabBarController)에 있을 때는 잘 됨!!


그래서 네비게이션 안에 있을땐 어떻게 해주어야 하느냐,,


open class DynamicStatusBarNavigation: UINavigationController {
    override open var childForStatusBarStyle: UIViewController? {
        return topViewController
    }
}

현재 네비게이션이 보여주고 있는 뷰컨트롤러의 statusBarStyle을 따라가도록 하는 NavigationController 클래스를 만들어서 사용한다!

잘 됨!






DynamicStatusBarNavigation에 embed 되어있는 상태!


첫번째 Main 뷰컨은 preferredStatusBarStyle을 lightContent로 설정해서 다크모드로 전환해도 흰색 유지


두번째 SomeVC 뷰컨에서는 preferredStatusBarStyle을 default 이기 때문에 다크모드로 전환하면 그에 맞춰 변경됨

'iOS' 카테고리의 다른 글

[번역] WatchKit - Life Cycles  (0) 2022.01.20
[번역] WatchKit  (0) 2022.01.20
Bastard Injection  (0) 2021.08.17
iOS TextField memory leak  (0) 2021.07.16
iOS App Life Cycle  (2) 2021.07.11