최신 업데이트 (Xcode 10+ / Swift 4.2+)
이 기사는 지난 몇 년 동안 존재했던 다양한 접근 방식의 논리를 기꺼이 이해하려는 사람에게는 영향을 미치지 않습니다. 한편 Xcode 10부터 Swift 4.2의 첫 번째 접근 방식 은 더 이상 사용되지 않으며 더 이상 지원되지 않습니다 (즉, 사용하려고하면 적용 되지 않습니다 ). Plist.info
깃발 뒤의 추론 과 커스터마이징 관행 을 더 잘 이해하기 위해 여전히 귀하의 정보를 참조합니다 .
중요한 설명
상태 표시 줄 모양을 사용자 정의하는 두 가지 접근 방식을 이해하는 것이 매우 중요합니다. 그것들은 다르며 혼합되어서는 안됩니다.
첫 번째 접근 방식 – 전체 앱에 대해 하나의 색상 (iOS7부터 더 이상 사용되지 않음)
info.plist에서라는 키를 찾거나 만듭니다.
View controller-based status bar appearance
그리고 NO로 설정하십시오 .
그것은 무엇입니까? 기본적으로 응용 프로그램에서 상태 표시 줄 모양 이 각보기 컨트롤러에 의해 개별적으로 정의되지 않는다는 설정을 설정합니다 . 이해하는 것이 매우 중요합니다. 즉, 모든 화면에 대해 전체 앱에 대해 균일 한 설정이 있습니다 . 두 가지 설정이 있습니다 : default
, 흰색 배경에 검은 색 텍스트 또는 lightContent
검은 색 배경에 흰색 텍스트.
이들 중 하나를 설정하려면 ( 모든 화면에 대해 하나의 설정 ) :
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent // .default
return true
}
이렇게하면 각 뷰 컨트롤러에서이 설정을 다시 설정할 필요가 없습니다. 그러나 항상이 방법을 사용하여 자발적으로 모양을 변경할 수 있습니다.
두 번째 방법 – 각 뷰 컨트롤러의 개별 색상
이것은 반대입니다. 작동하게하려면 info.plist로 이동하여
View controller-based status bar appearance
에 YES
이런 식으로 새 뷰 컨트롤러가 열릴 때마다 UIViewController
필요한 각 인스턴스 에이 구현을 삽입하면 상태 표시 줄 스타일이 개별적으로 설정됩니다 .
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
첫 번째와 동일하며 각보기 컨트롤러마다 상태 표시 줄에 어둡거나 밝은 스타일을 설정하십시오.
이 속성은 두 가지 시나리오에서 UIKit에 의해 가져옵니다.
- UI 초기화 준비 중 화면 초기화시
setNeedsStatusBarAppearanceUpdate()
코드 를 호출 할 때
후자의 경우 다음 코드를 사용하여 상태 표시 줄 모양을 조작 할 수 있습니다.
var isDark = false {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return isDark ? .lightContent : .default
}
func toggleAppearance() {
isDark.toggle()
}
그런 다음을 호출 할 때마다 toggleAppearance()
상태 표시 줄 스타일 변경이 트리거됩니다.
세 번째 접근법 – 해킹!
상태 표시 줄에 직접 액세스 할 수있는 해킹이 있습니다.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
statusBar.backgroundColor = UIColor.blue
}
return true
}
왜 해킹? 흑백 이외의 상태 표시 줄 색상이 필요한 경우 문서화되지 않은 API를 사용합니다. statusBar
KVC를 사용하여 객체를 가져 오고 배경색을 설정합니다. 이 방법으로 얻는 객체 는 입니다.이 속성 UIStatusBar
은 파생 UIView
되어 자연스럽게 backgroundColor
속성을 지원 합니다. 이 방법은 더럽고 법적 방법은 아니지만 지금까지 상태 표시 줄의 사용자 정의 색상을 설정하는 유일한 방법입니다 ( UINavigationBar
접근 방식 을 고려하지 않고 navbar + 상태 표시 줄 모양을 모두 사용자 정의 할 수 있음). 앱이 거부 될 수 있습니다. 하지만 운이 좋을 수도 있습니다. 그리고 복잡한 환경 (예 : 중첩, 자식 탐색 및보기 컨트롤러의 계층 구조와 같은)에서 이것은 상태 표시 줄 모양을 사용자 정의하는 최소한의 방법이거나 최소한 덜 번거로운 방법 일 수 있습니다 (예 : 투명하게 만들기)
Xcode 10+, 스위프트 4.2
더 이상 대안이 없습니다. 개발자는 플래그를 YES 로 설정 하거나 기본적으로 YES이므로이 작업을 생략하고 위의 지침을 따라 각 뷰 컨트롤러가 상태 표시 줄 모양을 정의 하도록해야 합니다.
보너스
어떤 상황에서든 상태 표시 줄 모양을 자발적으로 변경하기 위해 복잡한 환경에서 사용할 수있는 해킹 기반 솔루션입니다. 색상 방식으로 다음 확장 방법은 일반적인 접근 방식으로 수행 할 수있는 작업을 정확하게 수행합니다. 필요에 따라 조정할 수 있습니다.
extension UIViewController {
func setStatusBarStyle(_ style: UIStatusBarStyle) {
if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
statusBar.backgroundColor = style == .lightContent ? UIColor.black : .white
statusBar.setValue(style == .lightContent ? UIColor.white : .black, forKey: "foregroundColor")
}
}
}