developer tip

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

optionbox 2020. 10. 13. 07:40
반응형

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



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

누구 힌트가 있습니까?

나는 시도했다 UIViewControllerBasedStatusBarAppearance

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
}

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


이거 해봤 어?

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

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

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

    - (UIStatusBarStyle) preferredStatusBarStyle { 
        return UIStatusBarStyleLightContent; 
    }
    

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

[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];

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


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

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

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;

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

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

[UIApplication sharedApplication].statusBarStyle = UIBarStyleBlack;

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/


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

목표 C

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

빠른

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

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

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

빠른:

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/


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

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

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

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

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()
    }
}

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
    }

}


참고 URL : https://stackoverflow.com/questions/19013975/ios-7-and-later-set-status-bar-style-per-view-controller

반응형