iOS 7 trở lên: đặt kiểu thanh trạng thái cho mỗi bộ điều khiển chế độ xem


79


Tôi đã thử nhiều cách để đặt kiểu thanh trạng thái (mặc định hoặc lightcontent) nhưng không thể làm cho nó hoạt động trên cơ sở bộ điều khiển mỗi chế độ xem. Tôi chỉ có thể đặt kiểu thanh trạng thái cho toàn bộ ứng dụng.

Có ai có một gợi ý?

Tôi đã thử UIViewControllerBasedStatusBarAppearance

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
}

nhưng những phương pháp này không hoạt động.



1
Và chắc chắn rằng thanh điều hướng không nên chồng chéo với thanh trạng thái ....
Rajneesh071

Tôi sử dụng một mẹo nhỏ cho nó (và kiểm soát có thể nhìn thấy tiểu bang / ẩn) - Tôi đã quyết định xuất bản nó như pod 'UIViewController + ODStatusBar' ( cocoapods.org/pods/UIViewController+ODStatusBar )
Alex Nazarsky

1
Đây chỉ là một trong hàng tá API mà Apple ngẫu nhiên thay đổi hành vi của từ phiên bản iOS này sang phiên bản tiếp theo và vì một số lý do mà chưa có một cuộc nổi dậy hoàn chỉnh dành cho nhà phát triển. Bạn sẽ phải sửa đổi cách triển khai của mình để phù hợp với phiên bản iOS mà ứng dụng của bạn đang chạy và kiểm tra nó mỗi khi bạn xây dựng phiên bản mới hơn.
Bron Davies

Câu trả lời:


139

Bạn đã thử cái này chưa?

  1. Đặt "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" ( UIViewControllerBasedStatusBarAppearance) thành YEStrong Info.plist của bạn. ( YESlà mặc định, vì vậy bạn cũng có thể bỏ giá trị này ra khỏi danh sách của mình.)

  2. Trong phương thức viewDidLoad của bạn, hãy gọi [self setNeedsStatusBarAppearanceUpdate].

  3. Triển khai preferredStatusBarStyle, trả về kiểu thanh trạng thái mà bạn muốn cho bộ điều khiển dạng xem này.

    - (UIStatusBarStyle) preferredStatusBarStyle { 
        return UIStatusBarStyleLightContent; 
    }
    

I don't need step 1 tho
Van Du Tran

2
Điều này không hoạt động cho Iphone 5 + ios7. UIViewControllerBasedStatusBarAppearance là KHÔNG và [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackTranslucent]; đang làm việc tốt cho trường hợp của tôi :)
Femina

4
công trình @vishal với UINavigationController dựa ứng dụng nếu bạn đặt mã trong bạn lớp con tùy chỉnh UINavigationController
anneblue

3
Bạn không cần bước thứ 2.
Predbird

4
Không hoạt động đối với tôi trong iOS 8. Điều này chỉ thay đổi mặc định. Những gì tôi cần là màu trắng, bây giờ trở thành mặc định.
noobsmcgoobs

74

Có một vấn đề ở đây nếu bộ điều khiển chế độ xem của bạn nằm bên trong UINavigationController độc lập và không phải là một phần của UINavigationController dựa trên Storyboard thì trên tất cả các phương pháp đều thất bại. Tôi đã gặp phải tình huống này và sau đó để đặt thanh trạng thái thành kiểu sáng, tôi đã sử dụng

[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];

Điều này đã làm việc hoàn hảo cho tôi.


7
Không hoạt động nếu thanh điều hướng của bộ điều khiển điều hướng của bạn bị ẩn.
MLQ

Lời khuyên tương tự áp dụng cho UISplitViewController. Tôi đã kết thúc phân lớp.
Stephen Darlington

1
Theo sự hiểu biết của tôi, UINavigationBar.barStyleghi đè preferredStatusBarStyle. Bất kể bạn thiết lập như thế nào preferredStatusBarStyle, một cái tên `` UINavigationBar.setBarStyle '' chết tiệt sẽ tiếp quản mọi thứ.
Desmond DAI

22

CHỈNH SỬA: Giải pháp này không được dùng nữa trên iOS 9. Vui lòng chọn một trong các câu trả lời khác.

Với UIViewControllerBasedStatusBarAppearanceđặt thành KHÔNG, tôi có thể đặt kiểu thành văn bản màu trắng bằng cách sử dụng:

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;

Điều này là do màu văn bản trên kiểu này là màu trắng trên iOS 6 trở xuống.

CẬP NHẬT: Theo @jowie, bạn có thể thử điều đó trên iOS8:

[UIApplication sharedApplication].statusBarStyle = UIBarStyleBlack;

bạn đã đọc kỹ câu hỏi chưa? Anh ấy đang yêu cầu giải pháp iOS7 và cả kiểu sáng không tối của nó, trong trường hợp của bạn.
vishal dharankar

Nó hoạt động trên iOS7. Tôi đã đọc nó một cách cẩn thận. Và về UIBarStyleBlackTranslucent, nó hoạt động vì phong cách này trên iOS6 là nền đen (mờ) với văn bản màu trắng. Khi bạn làm điều đó trên iOS7, nó chỉ hiển thị văn bản màu trắng. Tôi biết nó trông có vẻ khó hiểu, nhưng đó là cách duy nhất tôi tìm ra để thực sự kiểm soát quầy bar.
caulitomaz

Đối với iOS 8, hãy sử dụng UIBarStyleBlack.
jowie

Cảm ơn @MatthieuRiegler, tôi sẽ đưa ra một thông báo.
caulitomaz

14

Trong Swift, tôi có thể làm điều này bằng cách viết:

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

moreViewController.navigationBar.barStyle = UIBarStyle.Black

Về cơ bản, bạn quan tâm đến dòng cuối cùng.
Điều này dẫn đến thanh tab thay đổi thành màu trắng:

nhập mô tả hình ảnh ở đây

Lưu ý rằng tôi đã không thay đổi bất cứ điều gì Info.plistđể đạt được kết quả này.
Để biết thêm thông tin về việc thay đổi Navigation Status Bar, vui lòng xem liên kết này: http://www.appcoda.com/customize-navigation-status-bar-ios-7/


Những công việc này. Tuy nhiên, nó không sử dụng "UIStatusBarStyleLightContent" mới, tôi tự hỏi liệu đó có phải là giải pháp bằng chứng trong tương lai không? Vẫn giải quyết vấn đề!
Van Du Tran

1
Sẽ là một câu trả lời tuyệt vời nhưng không hoạt động nếu thanh điều hướng của bạn bị ẩn.
MLQ

13

Trên phương thức viewDidLoad, hãy đặt cái này:

Mục tiêu C

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

Nhanh

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

Tôi rất vui được giúp bạn Gagan
Jota Freitas Jr

Có vẻ kỳ lạ khi bộ điều khiển chế độ xem đang cập nhật một thuộc tính cho toàn bộ ứng dụng - giải pháp phải dành cho toàn bộ ứng dụng (nằm trong AppDelegatebộ điều khiển chế độ xem) hoặc cho mỗi chế độ xem.
Zorayr

nhanh chóng tương đương với phương pháp này UIApplication.sharedApplication () setStatusBarStyle (UIStatusBarStyle.LightContent, hoạt hình: false).
minhazur

Để điều này hoạt động, giao diện Thanh trạng thái dựa trên bộ điều khiển chế độ xem phải được đặt thành KHÔNG trong thuộc tính đích. Tôi nghĩ đây là phương pháp tốt nhất vì nó đơn giản và hiển nhiên.
n13

7

Tôi cá là bạn đã nhúng bộ điều khiển chế độ xem của mình vào bộ điều khiển điều hướng. Để tránh thiết lập kiểu của thanh điều hướng để .Blacksử dụng lớp con này:

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

5

Nhanh:

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

Mục tiêu C:

nối cái này vào controller.mphương thức viewDidLoad tệp:

[self setNeedsStatusBarAppearanceUpdate].

sau đó triển khai phương thức này trong cùng một controller.mtệp:

- (UIStatusBarStyle) preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; 
}

Tài liệu chính thức:

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

Bài báo tôi đã viết trên blog của mình:

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


1

Trong ViewController mà bạn muốn thay đổi màu của thanh trạng thái

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

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

0

Tiện ích mở rộng Swift cho điều này vì tôi luôn quên cách hoạt động của nó

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,

Trong iPhone 8 12.4 Simulator, nó là OK.

Trong iPhone X 12.4 Simulator, tôi đã thử tất cả các cách trên, không được.

Sau đó, tôi thêm nó bằng tay, thanh trạng thái bao gồm thời gian, pin, di động.

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
    }

}


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.