iOS 7 이상 :보기 컨트롤러별로 상태 표시 줄 스타일 설정


79


상태 표시 줄 스타일 (기본값 또는 lightcontent)을 설정하기 위해 여러 가지 방법을 시도했지만 뷰 컨트롤러별로 작동하도록 할 수 없습니다. 전체 앱에 대해서만 상태 표시 줄 스타일을 설정할 수 있습니다.

누구 힌트가 있습니까?

나는 시도했다 UIViewControllerBasedStatusBarAppearance

과

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
}

그러나 이러한 방법은 작동하지 않습니다.



1
그리고 .... 탐색 막대가 상태 표시 줄과 중복되지 않도록하여주십시오
— Rajneesh071

나는 그것을 위해 약간의 트릭을 사용했다. (그리고 보이는 / 숨겨진 상태를 제어하기 위해) – 나는 그것을 'UIViewController + ODStatusBar'포드 ( cocoapods.org/pods/UIViewController+ODStatusBar ) 로 게시하기로 결정했다
— Alex Nazarsky

1
이것은 Apple이 iOS의 한 버전에서 다음 버전으로 동작을 임의로 변경하는 수십 개의 API 중 하나 일 뿐이며 어떤 이유로 완전한 개발자 반란이 없었습니다. 앱이 실행중인 iOS 버전에 맞게 구현을 수정하고 최신 버전을 빌드 할 때마다 테스트해야합니다.
— Bron Davies

답변:


139

이거 해봤 어?

  1. Info.plist에서 "컨트롤러 기반 상태 표시 줄 모양보기"( UIViewControllerBasedStatusBarAppearance)를 YES로 설정합니다. ( YES이 기본값이므로 plist에서이 값을 그대로 둘 수도 있습니다.)

  2. viewDidLoad 메서드에서 [self setNeedsStatusBarAppearanceUpdate].

  3. preferredStatusBarStyle이 뷰 컨트롤러에 대해 원하는 상태 표시 줄 스타일을 반환하는을 구현 합니다.

    - (UIStatusBarStyle) preferredStatusBarStyle { 
        return UIStatusBarStyleLightContent; 
    }
    

나는 그래도 1 단계를 필요로하지 않았다
— 반 뒤 트란

2
이 dint는 Iphone 5 + ios7에서 작동합니다. UIViewControllerBasedStatusBarAppearance는 NO이고 [[UIApplication sharedApplication] setStatusBarStyle : UIStatusBarStyleBlackTranslucent]입니다. : 내 경우에 잘 작동한다
— Femina

4
@vishal은 사용자 지정 UINavigationController 하위 클래스에 해당 코드를 넣는 경우 UINavigationController 기반 앱과 함께 작동합니다.
— anneblue

3
2 단계는 필요하지 않습니다.
— Ben Affleck

4
iOS 8에서는 작동하지 않습니다. 이것은 단지 기본값을 변경합니다. 내가 백인이되기 위해 필요한 것이 이제 기본값으로 이동합니다.
— noobsmcgoobs 2010

74

뷰 컨트롤러가 Storyboard 기반 UINavigationController의 일부가 아닌 독립 실행 형 UINavigationController 내부에 있으면 무엇보다도 모든 메서드가 실패합니다. 나는이 상황을 만났고 상태 표시 줄을 밝은 스타일로 설정하기 위해 다음을 사용했습니다.

[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];

이것은 나를 위해 완벽하게 작동했습니다.


7
내비게이션 컨트롤러의 내비게이션 바가 숨겨져 있으면 작동하지 않습니다.
— MLQ

비슷한 조언이 UISplitViewController에 적용됩니다. 나는 결국 서브 클래 싱을 끝냈다.
— Stephen Darlington 2015 년

1
내 이해에 따르면, UINavigationBar.barStyle우선합니다 preferredStatusBarStyle. 당신이 어떻게 설정하든간에 preferredStatusBarStyle, 하나의 망할`UINavigationBar.setBarStyle '이 모든 것을 차지합니다.
— Desmond DAI

22

편집 :이 솔루션은 iOS 9에서 더 이상 사용되지 않습니다. 다른 답변 중 하나를 선택하십시오.

UIViewControllerBasedStatusBarAppearanceNO로 설정 하면 다음을 사용 하여 스타일을 흰색 텍스트로 설정할 수 있습니다.

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;

이 스타일의 텍스트 색상은 iOS 6 이하에서 흰색 이었기 때문입니다.

업데이트 : @jowie에 따르면 iOS8에서 시도해 볼 수 있습니다.

[UIApplication sharedApplication].statusBarStyle = UIBarStyleBlack;

질문을주의 깊게 읽었습니까? 그는 iOS7 솔루션과 귀하의 경우에 어둡지 않은 밝은 스타일을 요구하고 있습니다.
— vishal dharankar 2014

iOS7에서 작동합니다. 나는 그것을주의 깊게 읽었다. UIBarStyleBlackTranslucent에 대해서는 iOS6의이 스타일이 흰색 텍스트가있는 검정색 배경 (반투명) 이었기 때문에 작동합니다. iOS7에서는 텍스트가 흰색으로 만 표시됩니다. 나는 그것이 끔찍해 보인다는 것을 알고 있지만, 그것이 내가 실제로 바를 통제 할 수있는 유일한 방법이었다.
— caulitomaz

iOS 8의 경우 UIBarStyleBlack.
— jowie

@MatthieuRiegler에게 감사드립니다. 알림을 올릴 것입니다.
— caulitomaz

14

Swift에서는 다음과 같이 작성하여이를 수행 할 수있었습니다.

let tbc : UITabBarController = self.window?.rootViewController as UITabBarController
var moreViewController : UINavigationController = tbc.moreNavigationController

moreViewController.navigationBar.barStyle = UIBarStyle.Black

기본적으로 마지막 줄에 관심이 있습니다.
이로 인해 탭 바가 흰색으로 변경되었습니다.

여기에 이미지 설명 입력

Info.plist이 결과를 얻기 위해 아무것도 변경하지 않았습니다 .
변경에 대한 자세한 내용은 Navigation Status Bar다음 링크를 확인하십시오. http://www.appcoda.com/customize-navigation-status-bar-ios-7/


작동합니다. 그러나 새로운 "UIStatusBarStyleLightContent"를 사용하지 않습니다. 이것이 미래 보장 솔루션인지 궁금합니다. 여전히 문제를 해결하십시오!
— Van Du Tran 2015 년

1
훌륭한 대답 이었지만 탐색 모음이 숨겨져 있으면 작동하지 않습니다.
— MLQ

13

viewDidLoad 메소드에서 다음을 입력하십시오.

목표 C

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[self setNeedsStatusBarAppearanceUpdate];

빠른

UIApplication.shared.statusBarStyle = .lightContent
self.setNeedsStatusBarAppearanceUpdate()

나는 가갠 당신을 도울 다행이야
— Jota Freitas의 주니어

보기 컨트롤러가 전체 애플리케이션에 대한 속성을 업데이트하고 있다는 것이 이상해 보입니다. 솔루션은 전체 애플리케이션 (에있는 AppDelegate) 또는보기 컨트롤러 당 하나 여야합니다 .
— Zorayr 2015

이 메서드에 해당하는 신속한 UIApplication.sharedApplication (). setStatusBarStyle (UIStatusBarStyle.LightContent, animated : false)
— minhazur

이 작업을 수행하려면 대상 속성에서 뷰 컨트롤러 기반 상태 표시 줄 모양을 NO로 설정해야합니다. 간단하고 뻔하기 때문에 이것이 최선의 방법이라고 생각합니다.
— n13

7

내비게이션 컨트롤러에 뷰 컨트롤러가 내장되어 있다고 확신합니다. .Black이 하위 클래스 를 사용 하도록 탐색 모음의 스타일을 설정하지 않으려면 :

class YourNavigationController: UINavigationController {
    override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return topViewController
    }
}

5

빠른:

let tbc : UITabBarController = self.window?.rootViewController as UITabBarController
var moreViewController : UINavigationController = tbc.moreNavigationController
moreViewController.navigationBar.barStyle = UIBarStyle.Black

목표 C :

이것을 controller.m파일 viewDidLoad 메소드에 추가하십시오 .

[self setNeedsStatusBarAppearanceUpdate].

그런 다음 동일한 controller.m파일 에서이 메서드를 구현 합니다.

- (UIStatusBarStyle) preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; 
}

공식 문서 :

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html

내 블로그에 쓴 기사 :

http://www.ryadel.com/2015/03/04/xcode-set-status-bar-style-and-color-in-objective-c/


1

상태 표시 줄의 색상을 변경하려는 ViewController에서

- (void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}

- (void) viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

0

나는 항상 이것이 어떻게 작동하는지 잊기 때문에 이것을위한 신속한 확장

extension UIViewController {
    // utility to set the status bar appearance
    // Note: Make sure "View controller-based status bar appearance" is set to NO in your target settings or this won't work
    func setStatusBarForDarkBackground(dark: Bool) {
        UIApplication.sharedApplication().statusBarStyle = dark ? .LightContent : .Default
        setNeedsStatusBarAppearanceUpdate()
    }
}

0

Xcode 10.3,

iPhone 8 12.4 Simulator에서는 OK입니다.

iPhone X 12.4 Simulator에서 위의 모든 것을 시도했지만 괜찮지 않았습니다.

그런 다음 손으로 추가하면 상태 표시 줄은 시간, 배터리, 셀룰러로 구성됩니다.

11

StatusBarView


class StatusBottomView: UIView {
    private var batteryView:BatteryView!
    private var timeLabel:UILabel!
    private var timer:Timer?

    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubviews()
    }

    private func addSubviews() {
        batteryView = BatteryView()
        batteryView.tintColor = UIColor.blue
        addSubview(batteryView)
        timeLabel = UILabel()
        timeLabel.textAlignment = .center
        timeLabel.font = UIFont.systemFont(ofSize: 12)
        timeLabel.textColor = UIColor.blue
        addSubview(timeLabel)
        didChangeTime()
        addTimer()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        let h = frame.size.height
        let x: CGFloat = 80
        batteryView.frame.origin = CGPoint(x: ScreenHeight - x - DZMBatterySize.width, y: (h - DZMBatterySize.height) / 2)
        timeLabel.frame = CGRect(x: x, y: 0, width: 50, height: h)
    }

    // MARK: -- Timer

    func addTimer() {
        if timer == nil {
            timer = Timer.scheduledTimer(timeInterval: 15, target: self, selector: #selector(didChangeTime), userInfo: nil, repeats: true)
            RunLoop.current.add(timer!, forMode: .common)
        }
    }


    func removeTimer() {
        if timer != nil {
            timer!.invalidate()
            timer = nil
        }
    }


    @objc func didChangeTime() {
        timeLabel.text = TimerString("HH:mm")
        batteryView.batteryLevel = UIDevice.current.batteryLevel
    }

}

BatteryLevelView

class BatteryView: UIImageView {

    override var tintColor: UIColor! {

        didSet{ batteryLevelView.backgroundColor = tintColor }
    }

    /// BatteryLevel
    var batteryLevel:Float = 0 {

        didSet{ setNeedsLayout() }
    }

    /// BatteryLevelView
    private var batteryLevelView:UIView!

    convenience init() {

        self.init(frame: CGRect(x: 0, y: 0, width: DZMBatterySize.width, height: DZMBatterySize.height))
    }


    override init(frame: CGRect) {

        super.init(frame: CGRect(x: 0, y: 0, width: DZMBatterySize.width, height: DZMBatterySize.height))

        addSubviews()
    }

    func addSubviews() {

        batteryLevelView = UIView()
        batteryLevelView.layer.masksToBounds = true
        addSubview(batteryLevelView)

        image = UIImage(named: "battery_black")?.withRenderingMode(.alwaysTemplate)
        tintColor = UIColor.white
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        let spaceW:CGFloat = 1 * (frame.width / DZMBatterySize.width) * HJBatteryLevelViewScale
        let spaceH:CGFloat = 1 * (frame.height / DZMBatterySize.height) * HJBatteryLevelViewScale

        let batteryLevelViewY:CGFloat = 2.1*spaceH
        let batteryLevelViewX:CGFloat = 1.4*spaceW
        let batteryLevelViewH:CGFloat = frame.height - 3.4*spaceH
        let batteryLevelViewW:CGFloat = frame.width * HJBatteryLevelViewScale
        let batteryLevelViewWScale:CGFloat = batteryLevelViewW / 100

        var tempBatteryLevel = batteryLevel

        if batteryLevel < 0 {

            tempBatteryLevel = 0

        }else if batteryLevel > 1 {

            tempBatteryLevel = 1

        }

        batteryLevelView.frame = CGRect(x: batteryLevelViewX , y: batteryLevelViewY, width: CGFloat(tempBatteryLevel * 100) * batteryLevelViewWScale, height: batteryLevelViewH)
        batteryLevelView.layer.cornerRadius = batteryLevelViewH * 0.125
    }

}


당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.