먹고 기도하고 코딩하라

[UIKit] Status bar 폰트 색상 동적으로 변경하기 본문

앱/Swift

[UIKit] Status bar 폰트 색상 동적으로 변경하기

사과먹는사람 2023. 8. 17. 22:30
728x90
728x90

 

한 뷰에서 동적으로 폰의 상태 바 색상을 변경해야 할 때가 있는데, 정적으로 설정하는 방법만 있고 동적으로 설정하는 건 잘 없어서 쓴다.

일단 iOS 13부터는 preferredStatusBarStyle을 오버라이드해서 상태바의 폰트 색상을 변경할 수 있다.

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

이렇게 하면 뷰에 진입했을 때 정적으로 상태 바 색상을 지정할 수는 있다.

이번에는 버튼을 탭하면 상단바 폰트 컬러가 검은색으로 나오도록 변경하고 싶다고 쳐보자.

스토리보드에 버튼을 하나 추가하고, IBAction 메소드를 하나 따서 이렇게 해보면 되지 않을까?

@IBAction func onButton(_ sender: UIButton) {
        preferredStatusBarStyle = .darkContent
    }

하지만 실제로 이렇게 했을 때, Cannot assign to property: 'preferredStatusBarStyle' is a get-only property 이라는 에러와 함께 컴파일 자체가 안 된다. preferredStatusBarStyle은 set할 수 없는 프로퍼티라는 거다.

이럴 때는 플래그 변수 하나를 둬서 해결하는 게 좋다. 이 플래그 변수의 값을 변화시킨 다음 setNeedsStatusBarAppearanceUpdate()로 상태 바 색상을 명시적으로 업데이트한다.

class ViewController: UIViewController {
    var isStatusBarDark: Bool = true
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return isStatusBarDark ? .darkContent : .lightContent
    }

    @IBAction func onButton(_ sender: UIButton) {
        isStatusBarDark = !isStatusBarDark
        setNeedsStatusBarAppearanceUpdate()
    }
}

스르륵 사라졌다가 나타나게 할 수 있도록 애니메이션을 추가해봤다.

Info.plist에 뭔가 추가할 필요는 딱히 없다. 예전에는 UIViewControllerBasedStatusBarAppearance 키의 값을 변경해줘야 하고 그랬어야 되나 본데, 글을 쓰는 지금(2023년 8월), xcode 14.3, minimum deployment 14.0 버전에서는 그렇게 해주지 않아도 잘 동작한다.

 

 

References

 

 

728x90
반응형
Comments