programing

iOS8에서 Swift를 사용하여 특정 ViewController의 상태 표시줄 색상 변경

lovejava 2023. 4. 9. 20:55

iOS8에서 Swift를 사용하여 특정 ViewController의 상태 표시줄 색상 변경

override func preferredStatusBarStyle() -> UIStatusBarStyle {
 return UIStatusBarStyle.LightContent;
}

ViewController에서 위의 코드를 사용하여 특정 ViewController의 상태 표시줄 색상을 흰색으로 설정하는 것은 iOS8에서 작동하지 않습니다.좋은 의견이라도 있나?UIApplication 사용shared Application 메서드는 전체 앱의 Info.plist에서 필요한 변경 후 색상이 변경됩니다.

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent

일부 필수 View Controller에 대해 상태 표시줄 색상을 변경하는 방법

모든 제안을 읽고 몇 가지 시도를 한 후 다음 단계를 통해 특정 뷰컨트롤러에 이 기능을 적용할 수 있습니다.

첫 번째 단계:

info.plist를 열고 "View controller-based status bar apasure"라는 새 키를 [NO]에 삽입합니다.

두 번째 단계(설명만 할 뿐 구현은 필요 없습니다.

보통 AppDelegate 어플리케이션(_:didFinishLaunchingWithOptions:) 메서드에 다음 코드를 넣습니다.

스위프트 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

스위프트 3

UIApplication.shared.statusBarStyle = .lightContent

그러나 이는 모든 ViewController의 에 영향을 미칩니다.

특정 View Controller에 대해 이 기능을 수행하는 방법 - 마지막 단계:

.statusBarStyle해 주세요.viewWillAppear(),

스위프트 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

스위프트 3

UIApplication.shared.statusBarStyle = .lightContent

「」, 「」를 .viewWillDisappear()하고 다음 의 viewController를 합니다.

스위프트 2

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default

}

스위프트 3

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

''가 바뀝니다.statusBarStyle한 후 "표시컨트롤러"로 합니다.default미실장viewWillDisappear() 바뀌게 .statusBarStyle인 「UIStatusBarStyle.LightContent

(2021년 10월 25일 현재)

Swift 5, Swift 4.2, Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}

Navigation Controller 탑재 Swift 4.2 솔루션

첫 번째 단계:

info.plist를 열고 "View controller-based status bar apaurance"라는 새 키를 삽입합니다.UIViewControllerBasedStatusBarAppearance[YES] : 각 VC가 자체 상태 속성을 사용할 수 있도록 합니다.

두 번째 단계

각 VC에서 다음과 같이 preferredStatusBarStyle 속성을 덮어씁니다.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent //.default for black style
}

마지막 단계

커스텀 Navigation Controller 클래스의 preferredStatusBarStyle 속성을 덮어씁니다.

class NavigationController : UINavigationController {

override var preferredStatusBarStyle : UIStatusBarStyle {

    if let topVC = viewControllers.last {
        //return the status property of each VC, look at step 2
        return topVC.preferredStatusBarStyle  
    }

    return .default
}

나는 이 튜토리얼을 따라했고 나에게 효과가 있었다.하지만 주의사항이 있는지 잘 모르겠습니다.

https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

  • info.plist를 합니다.UIViewControllerBasedStatusBarAppearance로로 합니다.false.
  • 의 첫 AppDelegate.swift이 들어있어요.didFinishLaunchingWithOptions원하는 색상을 설정합니다.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Swift 3 업데이트*

    UIApplication.shared.statusBarStyle = .lightContent

여기에 10억 개의 답이 있기 때문에 (@Curur의 도움을 받아) 확장자 형태로 하나 더 추가해 보는 것은 어떨까 생각했습니다.

스위프트 3

내선번호:

extension UIApplication {
    class var statusBarBackgroundColor: UIColor? {
        get {
            return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
        } set {
            (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
        }
    }
}

구현:

UIApplication.statusBarBackgroundColor = .blue

Info.plist에서 View 컨트롤러 기반 상태 표시줄 모양을 임의의 값으로 정의해야 합니다.

YES를 정의하면 각 뷰 컨트롤러에서 preferredStatusBarStyle 함수를 덮어써야 합니다.

NO를 정의하면 AppDelegate에서 다음을 사용하여 스타일을 설정할 수 있습니다.

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
override func viewWillAppear(animated: Bool) {
    self.navigationController?.navigationBarHidden =  true

    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
    if statusBar.respondsToSelector("setBackgroundColor:") {
        statusBar.backgroundColor = UIColor.redColor()
    }

}

스위프트 3

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

이것이 특정 뷰 컨트롤러의 상태 표시줄 배경색을 설정하는 솔루션입니다.

SWIFT 2

내 뷰에 다음을 추가하여 상태 표시줄 배경의 모양을 성공적으로 변경할 수 있었습니다.출두 예정:

let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }

(2020년 6월 10일 기준)

Swift 5(파일 편집 없음)

「 」를 사용하고 Storyboard 접속해 주세요.NavigationController을합니다.navigationBar을합니다.Attributes Inspectorstylelight content(흰색 상태 표시줄) 다음을 제외한 모든 항목을 설정합니다.default, ' style'이라고 .black 만약 이 원한다면dark content(검은색 상태 표시줄) 설정default

「」)UIBarStyleDefault)는.UIStatusBarStyleDefault그리고요.UIBarStyleBlack 주다UIStatusBarStyleLightContent상태 바

프로그램적으로

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar

네비게이션 바 없음(Edit

UIViewControllerBasedStatusBarAppearanceView controller-based status bar appearanceyour info.plist value가 set value입니다.true.

OverridepreferredStatusBarStyle

class ViewController: UIViewController {
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}

preferredStatusBarStyle와 같이, 「」라고 전화합니다.self.setNeedsStatusBarAppearanceUpdate()ViewDidLoad set 「Info.plist 」에서도 할 수 있습니다.UIViewControllerBasedStatusBarAppearance로로 합니다.YES((YES로 설정)

왜 그것이 작동하지 않는지는 명확하지 않다.코드를 확인해야 합니다.합니다.viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContent[ ablosed ]()을 보면 합니다.viewWillDisappear.

내 경우 스토리보드를 사용하여 뷰 컨트롤러를 구성합니다.모든 상태 표시줄 스타일을 변경합니다.

아래 그림에서 볼 수 있습니다.

여기에 이미지 설명 입력

Stars입니다.CPBaseNavigationController , .CPBaseNavigationController is is is of of of의 입니다.UINavigationController.

다음 setps를 시도합니다.

  1. »AppDelegate.swiftdidFinishLaunchingWithOptions, 덧셈, 덧셈

    //change status bar color
    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent
    

    효과는 없습니다.

  2. StoryBoard를 .Base Tab BarController(일부러) 선택하다Attributes Inspector을.Sattus Bar Light Content너무 심해서 효과가 없어

여기에 이미지 설명 입력

  1. 지막마 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」CPBaseNavigationController func , " " "preferredStatusBarStyle

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
       return .LightContent
    }
    

    잘 된다!

statusBarStyle 9.0을 할 수 .-[UIViewController preferredStatusBarStyle].

내비게이션 기반 응용 프로그램용 작업

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)

모든 것이 Swift 3.0 Xcode 8로 훨씬 쉬워졌습니다.

App Delegate 파일의 다음 코드를 사용하여

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

삽입:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)

스위프트 3

//
//  LoginController.swift
//  Swift 3
//
//  Created by The Crab on 17/01/2017.
//  Copyright © 2017 Paxi Labs. All rights reserved.
//

import UIKit

class LoginController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setNeedsStatusBarAppearanceUpdate()

        view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1)

    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

swift 3을 위해

.plist(플리스트)

View controller-based status bar appearance = NO

AppDelegate.swift

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Custom statubar
        UIApplication.shared.isStatusBarHidden = false
        UIApplication.shared.statusBarStyle = .lightContent
        let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        statusBar.backgroundColor = UIColor.gray

        return true
    }

UINavigationController 클래스의 확장을 만드는 것도 이 작업을 쉽게 수행할 수 있는 방법입니다.

「 」를 때문에,preferredStatusBarStyle:UINavigationController 클래스 내에서 실행하지 않는 한 메서드는 동작하지 않습니다.

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

Swift 4 네비게이션이 없는 특정 ViewController의 경우 ViewController 파일에 추가합니다.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Swift 5 또는 xcode 11 이상에서 info.plist에 있는 (컨트롤러 기반 상태 표시줄 표시) 를 아니요로 설정한 다음 프로젝트 대상으로 이동하여 General을 선택하고 상태 표시줄 스타일을 어둡거나 밝게 설정합니다.

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★뷰에 있는 상태 표시줄의 색상을 전체적으로 변경한 후 다시 표시로 변경한 것이 납득할 수 없는 답변이었습니다., 이 하려면 , 「」를 합니다.preferredStatusBarStyle원하는 뷰 컨트롤러로 이동합니다.오랜 시간이 흐른 후 저는 이렇게 했습니다.

  1. View에서 컨트롤러 기반 상태 합니다.info.plist[YES (네)로 합니다.네] (으)ㄹ 수 있다
  2. 뷰 할 수 . 상태 표시줄의 스타일은 " "를 덮어씁니다.preferredStatusBarStyle.
  3. 은 (뷰 컨트롤러에서는 때문에, (의) 모드 뷰 에서는 동작하지 않습니다.modal​Presentation​Captures​Status​Bar​Appearance,
  4. 또한 네비게이션컨트롤러와 같이 내장된 뷰컨트롤러가 있는 경우 상태바스타일에 대해 최상위 뷰컨트롤러에 문의합니다.「」의 덮어쓰기child​View​Controller​For​Status​Bar​Style임베디드 뷰 컨트롤러를 통과해야 하는데 안 되더라고요.기본 상태 표시줄 스타일로 삽입 뷰 컨트롤러 기본 상태 표시줄을 반환했습니다.다음과 같이 합니다.

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }
    

아래 코드를 사용하여 특정 색상(RGB 형식)을 설정했습니다.App Delegate 삭제:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
. . .

 UIApplication.sharedApplication().statusBarHidden = false
        UIApplication.sharedApplication().statusBarStyle = .LightContent

        let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
        if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
            statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0)
        }

. . .
}

키 요.Info.plist 삭제:

부울 값이 NO로 설정된 컨트롤러 기반 상태 표시줄 표시

스크린샷 1

스크린샷 2

더 간단한 방법을 제안할 수 있어요

  1. 애플 문서 설명대로 viewDidLoad의 setNeedsStatusBarAppearanceUpdate를 호출하기만 하면 됩니다.

뷰 컨트롤러의 상태 표시줄 속성(예: 숨김/숨김 해제 상태 또는 스타일)이 변경되면 이 메서드를 호출합니다.애니메이션 블록 내에서 이 메서드를 호출하면 변경 내용이 애니메이션 블록의 나머지 부분과 함께 애니메이션화됩니다.

  1. 원하는 유형을 반환하는 preferredStatusBarStyle을 구현합니다.

iOS 10.1에서는 동작했습니다.

목표 C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

재빠르다

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

아무도 이것을 지적하지 않았다니 놀랍다.아무튼 즐겨주세요:)

상태 바의 커스텀 컬러(iOS11+, Swift4+)

상태 표시줄을 사용자 지정 색상으로 변경하는 방법을 찾는 경우, 이것이 작동 가능한 솔루션입니다.

let statusBarView = UIView()
view.addSubview(statusBarView)
statusBarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    statusBarView.topAnchor.constraint(equalTo: view.topAnchor),
    statusBarView.leftAnchor.constraint(equalTo: view.leftAnchor),
    statusBarView.rightAnchor.constraint(equalTo: view.rightAnchor),
    statusBarView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
statusBarView.backgroundColor = .blue

Storyboard에서 네비게이션 컨트롤러로 이동하여 네비게이션 바를 선택하고 Attributes Inspector를 클릭한 다음 스타일을 기본값에서 검은색으로 변경합니다.바로 그거야!

Swift 4 또는 4.2의 경우

VC에 추가할 수 있습니다.

preferred Status Bar Style

반환값을 로 설정합니다.

.lightContent 또는 .default

예:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}

Swift 3.0 업데이트

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }

SWIFT 4.2 Graig Grummitt의 이 돌출적인 주제에 대한 훌륭한 기사에서 얻은 효과적인 해결책을 공유하고자 합니다.

스텝 1 다른 사람이 말한 것처럼 PLIST에 다음 추가

View controller-based status bar appearance YES

RootView컨트롤러에서 스텝2를 다음에 추가합니다.

var statusBarHidden: Bool = false {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var prefersStatusBarHidden: Bool {
        return statusBarHidden
    }

    var vcStatusBarStyle: UIStatusBarStyle = .default {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return vcStatusbarStyle
    }

의 속성을 할 때statusBarHidden ★★★★★★★★★★★★★★★★★」vcStatusBarStyle it it it it it it라고 부르게 될 setNeedsStatusBarAppearanceUpdate().prefersStatusBarHidden ★★★★★★★★★★★★★★★★★」preferredStatusBarStyle제 상황에서는 컨테이너 뷰 컨트롤러의 속성을 업데이트해야 했습니다.컨테이너 뷰 컨트롤러는 자녀 뷰 컨트롤러의 부모입니다.간단한 위임 방법을 사용하여 이 작업을 수행했습니다.

protocol MainViewControllerDelegate {
    func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
    func toggleStatusBar(visable: Bool)
}

물론 childViewController(Visible VC)를 인스턴스화할 때는 MainViewController(컨테이너 VC)를 위임자로 설정하는 것을 잊지 마십시오.가끔 그래요.:)

childViewController.delegate = self

그런 다음 childViewController에서 상태 표시줄을 업데이트해야 할 때 위임 메서드를 호출했습니다.

self.delegate?.updateStatusBarStyle(statBarStayle: .default)

위에서 설명한 바와 같이 Graig Grummitt는 이 솔루션에 대해 더 자세히 설명하고 UINavigation Controller와도 협력합니다.링크:상태 표시줄의 미스터리한 케이스

두 가지 상황이 있습니다.

1. show navigation bar (네비게이션 바 표시)

1) 추가1UIViewControllerBasedStatusBarAppearanceView controller-based status bar appearanceyour info.plist value가 set value입니다.true.

2) 커스텀 Navigation Controller 클래스의 preferredStatusBarStyle 속성을 덮어씁니다(@guillama에서).

class NavigationController : UINavigationController {

    override var preferredStatusBarStyle : UIStatusBarStyle {

    if let topVC = viewControllers.last {
        //return the status property of each VC, look at step 2
        return topVC.preferredStatusBarStyle  
    }
        return .default
    }

오버라이드 3) 오버라이드preferredStatusBarStyle'이것'은 다음과 같습니다.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

2. 숨겨진 탐색 모음

1) 동감

2) 위의 두 번째 단계는 필요하지 않습니다. 세 번째 단계는 직접 구현해야 합니다.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Swift 5, Swift 4.2에서는 이 방법을 사용합니다.

Info.plist에 다음 값을 추가합니다.

UIView Controller Based Status BarApearance = YES

또는

UIViewControllerBasedStatusBarAppliance = NO(변경 내용을 보려면)

UIStatus 바숨김 = NO

UIStatusBarStyle = UIStatusBarStyleDefault(또는 시작할 때 가벼운 상태 표시줄 텍스트를 보려면 UIStatusBarStyleLightContent로 설정)

Info.plist

그런 다음 아래 코드를 라이트 콘텐츠를 볼 특정 뷰 컨트롤러에 배치합니다(어두운 텍스트가 preferredStatusBarStyle을 .darkContent로 설정하는 것을 보려면).

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

override func viewDidLoad() {
    super.viewDidLoad()

    if let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as? UIView {
        statusBar.backgroundColor = .sunflowerYellow
    }
}

Supporting Files 그룹(왼쪽 상단 - 프로젝트 이름)을 클릭합니다.[Info]로 이동합니다.아래 번들 이름처럼 목록 사이에 있는 +를 클릭합니다.그리고 "View controller-based status bar attribution"을 추가하여 NO로 설정합니다.그런 다음 AppDelegate.swift를 열고 다음과 같이 수정합니다.

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

return true
}

바로 그거야.

언급URL : https://stackoverflow.com/questions/26956728/changing-the-status-bar-color-for-specific-viewcontrollers-using-swift-in-ios8