[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.swift1, didFinishLaunchingWithOptions기능 추가 :

UIApplication.shared.statusBarStyle = .lightContent

네비게이션 컨트롤러

당신은 탐색 컨트롤러를 사용하고 각 뷰 컨트롤러의 기본 상태 표시 줄 스타일을 사용하고 설정하려는 경우 View controller-based status bar appearanceYES응용 프로그램의에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에 의해 가져옵니다.

  1. UI 초기화 준비 중 화면 초기화시
  2. 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를 사용합니다. statusBarKVC를 사용하여 객체를 가져 오고 배경색을 설정합니다. 이 방법으로 얻는 객체 는 입니다.이 속성 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
}

하지 않는 작동 UIViewControllersA의 포함 UINavigationController에 대한 컴파일러 외모 때문에 statusBarStyleUINavigationController하지에 대한 statusBarStyleViewControllers그것으로 포함되어 있습니다.

이 답변이 성공하지 못한 사람들에게 도움이되기를 바랍니다.


답변

보기가 나타난 후 언제든지 상태 표시 줄 스타일을 변경하려면 다음을 사용할 수 있습니다.

  • 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에서 테스트

필요한 코드는 다음 단계를 따르십시오.

전체 앱에서 상태 표시 줄을 변경하려는 경우.

  1. 프로젝트 네비게이터에서 프로젝트를 선택하십시오 (왼쪽 패널).
  2. 대상을 선택하십시오.
  3. 일반 탭을 선택하십시오.
  4. 배포 정보를 찾으십시오.
  5. 상태 표시 줄 스타일을 밝게 변경하십시오 (어두운 배경은 “Light” , 밝은 배경은 “Default” )

info.plist 변경 사항을 잊지 마십시오

  1. 정보 탭을 선택하십시오
  2. 이 키를 plist 파일에 추가하십시오. “컨트롤러 기반 상태 표시 줄보기”= 아니오

프로젝트를 실행하고 확인하십시오.

Swift 5 및 Xcode 10.2 & 11.0의 프로젝트