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.