[ios] Swift 3에서 상태 표시 줄 스타일을 설정하는 방법
Xcode 8.0 베타 4를 사용하고 있습니다.
이전 버전에서 UIViewController에는 상태 표시 줄 스타일을 설정하는 메소드가 있습니다.
public func preferredStatusBarStyle() -> UIStatusBarStyle
그러나 Swift 3에서 “Get only only varaiable”로 변경되었습니다.
public var preferredStatusBarStyle: UIStatusBarStyle { get }
UIViewController에서 사용할 스타일을 어떻게 제공 할 수 있습니까?
답변
[업데이트] Xcode 10 이상 및 Swift 4.2 이상
이것은 iOS 7 이상에서 선호되는 방법입니다
애플리케이션에서 Info.plist
로 설정 View controller-based status bar appearance
하십시오 YES
.
각보기 컨트롤러에서 재정의 preferredStatusBarStyle
( Apple docs ) 예를 들면 다음과 같습니다.
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
preferredStatusBarStyle
보기 컨트롤러 내부에서 변경되는 내용 (예 : 스크롤 위치 또는 표시된 이미지가 어두운 지 여부)에 따라 다른 기본 상태 표시 줄 스타일 을 반환하는 setNeedsStatusBarAppearanceUpdate()
경우 해당 상태가 변경 될 때 호출하려고합니다 .
버전 7 이전의 iOS는 더 이상 사용되지 않는 메소드
Apple은이 기능을 더 이상 사용하지 않으므로 향후 제거 될 예정입니다. 다음 iOS 버전이 출시 될 때 다시 작성할 필요가 없도록 위의 방법을 사용하십시오.
애플리케이션이 애플리케이션에서을 지원하는 경우로 Info.plist
설정 View controller-based status bar appearance
하십시오 NO
.
에서 appDelegate.swift
1, didFinishLaunchingWithOptions
기능 추가 :
UIApplication.shared.statusBarStyle = .lightContent
네비게이션 컨트롤러
당신은 탐색 컨트롤러를 사용하고 각 뷰 컨트롤러의 기본 상태 표시 줄 스타일을 사용하고 설정하려는 경우 View controller-based status bar appearance
에 YES
응용 프로그램의에info.plist
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}
}
답변
최신 업데이트 (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")
}
}
}
답변
반환 된 값을 설정하지 않고 무시하려고 시도 할 수 있습니다. 메소드는 {get}로 선언되므로 getter를 제공하십시오.
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
이 조건을 조건부로 설정하면 setNeedsStatusBarAppearanceUpdate()
준비가되었을 때 변경 사항에 애니메이션이 적용되도록 전화해야합니다.
답변
스위프트 3 & 4, iOS 10 & 11, Xcode 9 & 10
나 에게이 방법은 작동하지 않습니다.
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
각보기 컨트롤러에 익숙했지만 이것은 효과가있었습니다.
-
info.list 파일에서 행 :을 추가
View controller-based status bar appearance
하고로 설정하십시오.NO
-
appdelegate에서 다음 :
UIApplication.shared.statusBarStyle = .lightContent
답변
statusBar
의 색상을 흰색 으로 변경하려면에 포함 된 모든보기에 대해 다음 UINavigationController
을 추가하십시오 AppDelegate
.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UINavigationBar.appearance().barStyle = .blackOpaque
return true
}
이 코드는 :
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
하지 않는 작동 UIViewControllers
A의 포함 UINavigationController
에 대한 컴파일러 외모 때문에 statusBarStyle
의 UINavigationController
하지에 대한 statusBarStyle
의 ViewControllers
그것으로 포함되어 있습니다.
이 답변이 성공하지 못한 사람들에게 도움이되기를 바랍니다.
답변
보기가 나타난 후 언제든지 상태 표시 줄 스타일을 변경하려면 다음을 사용할 수 있습니다.
-
info.list 파일에서 행 추가 : 컨트롤러 기반 상태 표시 줄 모양 을보고 YES로 설정하십시오.
var viewIsDark = Bool() func makeViewDark() { viewIsDark = true setNeedsStatusBarAppearanceUpdate() } func makeViewLight() { viewIsDark = false setNeedsStatusBarAppearanceUpdate() } override var preferredStatusBarStyle: UIStatusBarStyle { if viewIsDark { return .lightContent } else { return .default } }
답변
Xcode 10 이상
스위프트 5에서 테스트
필요한 코드는 다음 단계를 따르십시오.
전체 앱에서 상태 표시 줄을 변경하려는 경우.
- 프로젝트 네비게이터에서 프로젝트를 선택하십시오 (왼쪽 패널).
- 대상을 선택하십시오.
- 일반 탭을 선택하십시오.
- 배포 정보를 찾으십시오.
- 상태 표시 줄 스타일을 밝게 변경하십시오 (어두운 배경은 “Light” , 밝은 배경은 “Default” )
info.plist 변경 사항을 잊지 마십시오
- 정보 탭을 선택하십시오
- 이 키를 plist 파일에 추가하십시오. “컨트롤러 기반 상태 표시 줄보기”= 아니오
프로젝트를 실행하고 확인하십시오.
Swift 5 및 Xcode 10.2 & 11.0의 프로젝트