Swift 3에서 상태 표시 줄 스타일을 설정하는 방법


186

Xcode 8.0 베타 4를 사용하고 있습니다.

이전 버전에서 UIViewController에는 상태 표시 줄 스타일을 설정하는 메소드가 있습니다.

public func preferredStatusBarStyle() -> UIStatusBarStyle

그러나 Swift 3에서 "Get only only varaiable"로 변경되었습니다.

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

UIViewController에서 사용할 스타일을 어떻게 제공 할 수 있습니까?


UIStatusBarStyle = .lightContent이 var에 preferredStatusBarStyle 시도
Anbu.Karthik을

답변:


485

[업데이트] 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
   }
}

3
나를 위해 작동합니다. Info.plist에 새로운 설정을 먼저 삽입하는 것을 잊었습니다.
falsecrypt

1
@LightMan uiapplication statusBarStyle은 더 이상 사용되지 않으며 iOS 11에서 이것을 사용했으며 작동합니다.
Sushobhit

1
이 답변에 사용 된 @Sushobhit setStatusBarStyle은 iOS 9에서 더 이상 사용되지 않습니다. 그러나 여전히 UIApplication.statusBarStyle을 읽기 전용 속성으로 유지합니다.
LightMan

1
각보기의 색상으로 인해 프로그래밍 방식으로 설정할 수있는 시간이 있습니다.
Alejandro Cavazos

9
appDelegate.swift에서 라인을 제거하고 Target-> General-> Deployment
Info-

162

최신 업데이트 (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")
        }
    }
}

2
상태 표시 줄이 있으면 다음과 같이 할 수도 있습니다. statusBar.setValue (UIColor.red, forKey : "foregroundColor"); 또는 UIStatusBar에는 사용할 수 있지만 UIView에는 사용할 수없는 속성을 설정하려면 기존 키를 사용하십시오.
Mark

application.statusBarStyle = .lightContent이 방법은 'statusBarStyle'에 대한 iOS9> 세터 때문에 일반적으로는 아이폰 OS 9.0에서 사용되지 않습니다 : 사용 - [UIViewController에 preferredStatusBarStyle] 이동에 대기가있는 UIViewController위한 것입니다
toxicsun

앱의 색상 테마를 변경할 때 여기에서만 작동합니다. 그러나 일단 설정되면 뷰 컨트롤러를 전환 할 때 항상 재설정해야합니다. preferredStatusBarStyle () 메소드는 여기서부터 무시됩니다 (info.plist의 적절한 설정으로도).
nontomatic

2
이 답변은 다른 사람에 비해 더 설명 적입니다.
ViruMax

2
보너스 솔루션은 iOS 13.1에서 깨짐
ViruMax

130

반환 된 값을 설정하지 않고 무시하려고 시도 할 수 있습니다. 메소드는 {get}로 선언되므로 getter를 제공하십시오.

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

이 조건을 조건부로 설정하면 setNeedsStatusBarAppearanceUpdate()준비가되었을 때 변경 사항에 애니메이션이 적용되도록 전화해야합니다.


2
prefersStatusBarHidden일부보기에 대해 선택할 수 있으므로이 방법이 더 좋습니다 . 당신이 가고 있다면 당신은 UIApplication.shared.statusBarStyle그것에 붙어있을 것입니다.
superarts.org

105

스위프트 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

앱 위임에 코드를 추가 한 후에 만 ​​시도했지만 정보 plist 설정이 도움이되었습니다. 감사합니다
Akhilesh Sharma

6
'statusBarStyle'에 대한 Setter는 iOS 9.0에서 더 이상 사용되지 않습니다 :
Use-

33

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그것으로 포함되어 있습니다.

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


네 정말 감사합니다! 네비게이션 컨트롤러는 많은 사람들이 고려하지 않은 약간의 뉘앙스였습니다!
Alexis Candelaria

26

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

  • 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 
        } 
    }

1
그리고If you call this method within an animation block, the changes are animated along with the rest of the animation block.
알렉산드르 G

26

Xcode 10 이상

스위프트 5에서 테스트

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

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

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

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

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

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

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


Xcode 10 / Swift5의 경우 이것이 정답입니다. 이 작업을 수행하려면 두 단계를 모두 수행해야합니다.
John Robi

완전한. 감사합니다! 이것이 실제 허용되는 답변이어야한다는 데 동의합니다.
DungeonDev

이것은 완벽한 답변입니다 🤟🏻
nikhilgohil11

이것은 스위프트 5와 함께 xcode 11에서도 완벽하게 작동합니다. 감사합니다
Luis Santiago

25

Info.plist 파일에 아래 키를 추가해야합니다.

View controller-based status bar appearance 부울 값을 NO

appdelegate 클래스에서 didFinishLaunchingWithOptions리턴하기 전에 메소드 에서 .

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) {
    statusBar.backgroundColor = UIColor.red
}
UIApplication.shared.statusBarStyle = .lightContent

변경 backgroundColorstatusBarStyle요구 사항에 따라.


좋은 해결책이지만 개인 API를 사용하는 것으로 간주됩니까?
GoldenJoe

잘 작동하지만 어떻게 사용자 정의 색상으로 변경할 수 있습니까?
iSrinivasan27

"UIColor.red"대신 @MohanSrinivasan을 사용하여 사용자 지정 색을 지정할 수 있습니다.
Himanshu padia

13

스토리 보드에서이 작업을 수행 할 수도 있습니다

  1. info.plist "컨트롤러 기반 상태 표시 줄 모양보기"에 새 항목을 작성하여 "YES"로 설정하십시오.
  2. 스토리 보드로 이동 한 다음 변경할 탐색 컨트롤러를 선택하십시오. 스토리 보드 문서 개요 섹션 (스토리 보드의 왼쪽 패널)에서 탐색 모음을 클릭하십시오.
  3. 오른쪽 패널로 이동하여 속성 섹션을 클릭하십시오.
  4. 탐색 모음 섹션에는 스타일이 표시됩니다. 원하는 스타일을 선택하십시오 (기본값은 검은 색, 검은 색은 흰색)

가지고있는 각 네비게이션 컨트롤러에 대해이 작업을 수행해야합니다. 그러나 해당 탐색 제어기 아래의 모든보기는 모든보기의 상태 표시 줄 스타일 / 색상을 방금 선택한 것과 동일하게 변경합니다. 결과를 즉시 볼 수 있고 모든 뷰 컨트롤러에 추가 코드 줄을 추가 할 필요가 없기 때문에이 옵션이 더 좋습니다.

여기에 이미지 설명을 입력하십시오

(모든 Swift 프로젝트에서 Xcode 8.3.3으로 완료)


"컨트롤러 기반 상태 표시 줄보기"가 "NO"로 설정되어야합니다.
Willjay

2
View Controller 콘텐츠에 따라 상태 표시 줄 스타일을 설정하는 매우 깔끔한 방법 View controller-based status bar appearance = NO입니다. 이는 전체 앱에서 밝거나 어두운 스타일 만 사용 하는 대신 올바른 방법 입니다. 이 "코드리스"방식은 Navigation Controller에서만 작동한다는 것은 부끄러운 일입니다. Apple은 View Controller 인스턴스 내에이 옵션을 설정하기 위해 다른 필드를 추가하는 것을 고려해야합니다.
aldoram5

12

iOS 11의 모든 뷰 컨트롤러에 대한 상태 표시 줄을 변경하려는 사람들에게는 Swfit 4/5 솔루션이 매우 쉽습니다.

1) Info.plist 추가 :

컨트롤러 기반 상태 표시 줄보기-> 아니요

2) XCode slect 프로젝트의 왼쪽> 대상 > 프로젝트 선택> 일반> 배치 정보> 상태 표시 줄 스타일 선택 : 조명

하나의 viewcontroller에 대해서만 상태 표시 줄을 변경하려면 viewDidLoad에 다음을 추가하십시오.

2.1 ) Info.plist

컨트롤러 기반 상태 표시 줄보기-> 예

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

앱 델리게이트에서 Objective-C (또는 반응 네이티브) 변경 :

1) Info.plist 추가 :

컨트롤러 기반 상태 표시 줄보기-> 아니요

2) AppDelegate-> didFinishLaunchingWithOptions

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];

상태 표시 줄 변경 은 푸시 (탐색 컨트롤러)를 시도 하지 않으며 모달 뷰 컨트롤러를 제시하는 경우에만 작동합니다.


8

첫 번째 단계는 key : View controller-based status bar appearance및 value NO가 있는 행 을 Info.plist파일에 추가해야 합니다. 그런 다음 컨트롤러에 2 가지 기능을 추가하여 해당 컨트롤러에만 적용하십시오.

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       UIApplication.shared.statusBarStyle = .lightContent
}

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        UIApplication.shared.statusBarStyle = .default    
}

6

스위프트 3

Info.plist에서 "컨트롤러 기반 상태 표시 줄보기"라는 행을 추가하고 값을로 설정하십시오 No.

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarStyle = .lightContent //or .default
        setNeedsStatusBarAppearanceUpdate()

    }

}

6

탐색 모음을 처리 할 때 상태 표시 줄 텍스트 색상에 작은 문제가있는 것 같습니다.

.plist 항목보기 컨트롤러 기반 상태 표시 줄 모양을 YES 경우 색상이 지정된 탐색 모음이있을 때 작동하지 않는 경우가 있습니다.

예를 들면 다음과 같습니다.

override func viewWillAppear(_ animated: Bool) {
    let nav = self.navigationController?.navigationBar
    nav?.barTintColor = .red
    nav?.tintColor = .white
    nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

AppDelegate에서 다음을 설정 한 경우에도 위의 코드가 작동하지 않습니다.

UIApplication.shared.statusBarStyle = .lightContent

여전히 어려움을 겪고있는 사람들에게는 네비게이션 바의 스타일에 따라 상태 표시 줄이 밝거나 어두워 야하는지 판단합니다. 그래서 viewWillAppear에 다음 줄을 추가 하여이 문제를 해결했습니다.

nav?.barStyle = UIBarStyle.black

막대 스타일이 검은 색이면 재정의 된 변수를 수신합니다. 희망이 누군가에게 도움이되기를 바랍니다 :)


6

@Krunal https://stackoverflow.com/a/49552326/4697535에 의해 위대한 asnwer에 추가하려면

당신은을 사용하는 경우 UINavigationController는이 preferredStatusBarStyle상의 영향을주지 않습니다 UIViewController.

Xcode 10 및 Swift 4.

맞춤 설정 UINavigationController

예:

class LightNavigationController: UINavigationController {

   open override var preferredStatusBarStyle: UIStatusBarStyle {
       return .lightContent
   }
}

앱 수준 솔루션의 확장 프로그램을 사용하십시오.

extension UINavigationController {

  open override var preferredStatusBarStyle: UIStatusBarStyle {
      guard let index = tabBarController?.selectedIndex else { return .default }
      switch index {
      case 0, 1, 2: return .lightContent // set lightContent for tabs 0-2
      default: return .default // set dark for tab 3
      }
  }
}

5

Xcode 8.3.1, 스위프트 3.1

  1. info.plist "컨트롤러 기반 상태 표시 줄 모양보기"에 새 항목을 작성하여 "NO"로 설정하십시오.

  2. AppDelegate.swift를 열고 "didFinishLaunchingWithOptions"메소드에 다음 줄을 추가하십시오 :

application.statusBarStyle = .lightContent


5

스위프트 4+

흰색 상태 표시 줄 텍스트의 경우 :

navigationController.navigationBar.barStyle = .blackTranslucent

5

상태 표시 줄 스타일 변경에 관한 Apple 지침 / 지침 은 다음과 같습니다 .

상태 표시 줄 스타일을 설정 UIViewControllerBasedStatusBarAppearance하려면 파일 NO에서 응용 프로그램 수준을 설정 .plist하십시오. 그리고 appdelegate> didFinishLaunchingWithOptions다음에 추가 하십시오 (프로그래밍 방식으로 앱 대리자에서 할 수 있음).

목표 C

[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

빠른

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent
    return true
}

상태 표시 줄 스타일을 설정하려는 경우보기 컨트롤러 수준에서 다음 단계를 수행하십시오.

  1. 설정 UIViewControllerBasedStatusBarAppearanceYES.plist당신의 UIViewController 수준 만 설정 상태 표시 줄 스타일을 필요로하는 경우, 파일.
  2. viewDidLoad 추가 기능에서- setNeedsStatusBarAppearanceUpdate

  3. 뷰 컨트롤러에서 preferredStatusBarStyle을 재정의하십시오.

목표 C

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

빠른

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

상태 표시 줄 스타일 설정 레벨에 따라 .plist의 값을 설정하십시오.

여기에 이미지 설명을 입력하십시오


4

Swift 4.0 "didFinishLaunchingWithOptions launchOptions :"에서이 코드를 사용하십시오. Appdelegate 클래스

UIApplication.shared.statusBarStyle = .lightContent
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){
  statusBar.backgroundColor = UIColor.black
}

4

iOS 11.2

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .black

    return true
}

'blackOpaque'를 사용할 수 없음 : UIStatusBarStyleLightContent 사용
Makalele

3

이것은 나를 위해 일했다

plist에서 View controller-based status bar모양을 NO 로 설정 한 다음 In UIViewController viewDidAppear은 다음 줄을 추가했습니다.

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)

setStatusBarStyle은 iOS 9에서 더 이상 사용되지 않습니다.
Lastmboy

3

스위프트 3

Info.plist에서 View 컨트롤러 기반 상태 표시 줄 모양 = YES 인 경우

그런 다음 모든 NavigationController에이 확장을 사용하십시오.

    extension UINavigationController
    {
        override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
         }
     }

UINavigationController가없고 UIViewController 만있는 경우 아래 코드를 사용하십시오.

    extension UIViewController
    {
        override open var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
         }
     }

2
나를 위해 작동하지 않습니다. "속성이 속성이 수퍼 클래스의 속성을 재정의하지 않습니다"및 "Objective-C 선택기를 사용하는 'preferredStatusBarStyle'에 대한 Getter가 동일한 Objective-C 선택기를 사용하여 이전 선언과 충돌합니다."라는 오류가 발생합니다.
Theo

이것을 시도해 주셔서 감사합니다. 20 가지의 다른 시도와 몇 가지 항목 조합을 시도한 후 상태 표시 줄 색상을 설정하는 방법입니다. 야간 모드에서 추가 할 때 색상을 변경하고 싶을 때 검은 색이 검은 색으로 작동하지 않을 때 setNeedsStatusBarAppearanceUpdate ()를 호출해야한다는 것을 기억해야했습니다.
Stuart P.

3

스위프트 5

https://stackoverflow.com/a/40066798/2082851 에서 PRAVEEN의 답변에 대한 자세한 내용을 추가하려면 구현을 제공하고 싶습니다. 각 컨트롤러의 상태 표시 줄을 사용자 지정할 수있는 유연성 을 지원 합니다 .

전반적으로, 우리는 모든 경우에 속성 BaseViewController을 처리 할 statusBarStyle객체를 만들 것 입니다. 새 컨트롤러를 만들 때는이 기본 컨트롤러의 하위 클래스로 만드십시오.

상태 모양을 변경할 때마다이 속성 만 업데이트하면됩니다. 상태 표시 줄 스타일이 즉시 업데이트됩니다.

이행

class BaseViewController: UIViewController {

    var statusBarStyle: UIStatusBarStyle = .default {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

데모

class ViewController: BaseViewController, UIScrollViewDelegate {

    let scrollView = UIScrollView()
    ... 
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 30 {
                self.statusBarStyle = .darkContent
            } else {
                self.statusBarStyle = .lightContent
            }
        }
    }
}

여기에 이미지 설명을 입력하십시오

2. UINavigationController

UINavigationController경우 특별한 경우이며 두 가지 솔루션 중 하나를 수행 할 수 있습니다.

해결 방법 A : 메시지 발송으로 재정의

UINavigationController는 NSObject and and inherit from ObjectiveC이므로 해당 메소드가 message dispatch있으며이를 대체 할 수 있습니다.

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

솔루션 B : UINavigationController서브 클래스 작성

이미 UINavigationController추가 요구 사항을 제어해야하는 사용자 정의가있는 경우 이것이 가장 적합한 솔루션입니다.

final class NavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
    }
}

2

"shouldStatusBarDark"라는 부울 속성을 사용하여 상태 표시 줄 색상을 전환 할 수 있습니다. 또한 스크롤 할 때 상태 표시 줄 색상을 변경하기 위해 값을 업데이트 할 수도 있습니다.

 var shouldStatusBarDark = false {
     didSet {
         setNeedsStatusBarAppearanceUpdate()
     }
 }

 override var preferredStatusBarStyle: UIStatusBarStyle {
     return shouldStatusBarDark ? .default : .lightContent
 }

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
     let offSetY = scrollView.contentOffset.y
     if offSetY > 50 {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 1
             self.shouldStatusBarDark = true
         })
     } else {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 0
             self.shouldStatusBarDark = false
         })
     }
 }

navView 속성이란 무엇입니까? 덕분에 솔루션을 공유
medskill

1
@medskill navView는 프로그래밍 방식으로 추가 된 모방 탐색 모음입니다.
tiantong

2

이 답변의 대부분은 다시 해시되는 것과 동일하지만 어두운 배경을 사용할 때 실제로 시작 화면을 처리하는 것은 없습니다.

나는 info.plist가벼운 스타일의 상태 표시 줄을 생성 한 내에서 다음과 같이했습니다 .

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

2

다음 메시지가 표시 되는 경우 iOS 9.0에서 'statusBarStyle'에 대한 Setter가 더 이상 사용되지 않습니다.-[UIViewController preferredStatusBarStyle] 을 사용하고 상태 표시 줄을 밝거나 어둡게 설정하려면 다음 코드를 사용하십시오.

//To set the status bar to white
self.navigationController?.navigationBar.barStyle = .black //or .blackTranslucent

//To set the status bar to black
self.navigationController?.navigationBar.barStyle = .default

이렇게하면 navBar가 스타일을 완전히 나타내지 않으므로 상태 표시 줄이 변경됩니다.

NB. info.plist에 설정되어 있는지 확인해야합니다.

View controller-based status bar appearance to YES

2

모달 프레젠테이션을 사용하는 경우 다음을 설정해야합니다.

viewController.modalPresentationCapturesStatusBarAppearance = true

1

iOS 13에서는 .darkContent UIStatusBarStyle속성을 사용 하여 어두운 상태 표시 줄을 표시 할 수 있습니다


0

목표 C의 경우 응용 프로그램 didFinishLaunch 메소드 에이 줄을 추가하십시오.

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;

3
이것은 iOS 9부터 사용되지 않습니다
MK_Dev

0

WebkitView 사용

스위프트 9.3 iOS 11.3

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!
    var hideStatusBar = true

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate()
        let myURL = URL(string: "https://www.apple.com/")
        let myRequest = URLRequest(url: myURL!)
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red

         webView.load(myRequest)

    }
}

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

3
스위프트 9.3? 잘못된 해, 마티
iOS 유닛

exaple "statusBar"에 개인 API를 사용하지 않는 것이 좋습니다. Apple은 API를 수시로 변경합니다! 그리고 애플이 해당 API를 변경하면 앱이 중단되어 더 이상 상태 표시 줄이 변경되지 않습니다. 이렇게하면 다른 솔루션을 다시 검색 할 수 있습니다.
Doci

0

메소드에서 상태 표시 줄 스타일 기반을 여전히 변경할 수없는 경우

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

이 방법을 사용해보십시오.

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.