UIStatusBarStyle không hoạt động trong Swift


85

Tôi đang cố gắng thay đổi màu Thanh trạng thái trong ứng dụng Swift của mình thành màu trắng, nhưng lại gặp phải bức tường gạch. Tôi có 3 ViewController mà mỗi ViewController đều được nhúng trong NavigationController (đó có thể là vấn đề? Tôi đã cố gắng đặt mã vào lớp NavigationController.) Tôi đã thử cả hai đoạn mã sau trong didFinishLaunchingWithOptions của AppDelegate của mình .swift tệp nhưng không hoạt động.

application.statusBarStyle = .LightContent

UIApplication.sharedApplication().statusBarStyle = .LightContent

Tất cả những gì Tài liệu phải nói về nó là UIBarButtonStyle là một Int và đã cho tôi đoạn mã enum này mà không giúp tôi chút nào về vấn đề này.

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

Tôi đang thiếu gì?

Câu trả lời:


145

Bạn có hai lựa chọn.

Nếu bạn muốn tiếp tục thiết lập kiểu của thanh trạng thái theo cách thủ công, hãy tiếp tục làm những gì bạn đang làm, nhưng bạn sẽ cần thêm khóa sau vào tệp info.plist của mình với giá trị là NO.

Xem giao diện thanh trạng thái dựa trên bộ điều khiển

Hoặc, nếu bạn muốn tiếp tục sử dụng giao diện thanh trạng thái dựa trên bộ điều khiển chế độ xem, thay vì đặt statusBarStyle của ứng dụng, hãy ghi đè thuộc preferredStatusBarStyletính trong mỗi bộ điều khiển chế độ xem mà bạn muốn chỉ định kiểu thanh trạng thái.

Swift 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

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

Tôi đã thử mã này ... nhưng tôi chỉ nhận được thanh trạng thái màu trắng trong màn hình đầu tiên .. Tôi không nhận được thanh trạng thái cho phần còn lại của màn hình :( .. bất kỳ trợ giúp nào?
Rahul

7
Bạn phải đặt cài đặt "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" trong bảng xếp hạng của mình thành CÓ.
StackUnderflow

1
Đó là chỉ khi bạn muốn sử dụng giao diện thanh trạng thái dựa trên bộ điều khiển chế độ xem.
Sam Holmes

4
trong iOS 10 (Swift 3.0) nó không còn là phương thức nữa mà là thuộc tính. Xem: stackoverflow.com/questions/38862208/…
stevo.mit

chỉ dành cho một màn hình
Oubaida AlQuraan 22/02/17

143

Swift 3.0

trong AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

Swift 2.2

trong AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO

1
Đây là câu trả lời hoàn hảo :)
Jay Mayu

1
Câu trả lời hoàn hảo. Ngắn và ngọt.
Mehul

3
xin lỗi, đây có thể là câu trả lời đơn giản nhất, nhưng nó chắc chắn không phải là TỐT NHẤT: bởi vì nó chỉ đặt một kiểu này cho tất cả và mọi viewControllers trong ứng dụng. Hành vi đã được giới thiệu để cho phép kiểm soát tốt hơn và áp dụng các cài đặt khác nhau dựa trên các bộ điều khiển chế độ xem khác nhau (ví dụ: trộn nội dung sáng và tối).
auco

Thật kỳ lạ - không phải những gì tài liệu của Apple nói, nhưng nó hoạt động. Đã thử một loạt các cách khác, bao gồm cả việc sử dụng thanh trạng thái dựa trên UIViewController, nhưng không cách nào trong số đó hoạt động.
n13,

33

Bạn phải đặt:

navigationController.navigationBar.barStyle = .black

và văn bản sẽ xuất hiện bằng màu trắng


1
Cảm ơn! Có gì giúp thậm chí ghi đè này func preferredStatusBarStyle () -> UIStatusBarStyle {return UIStatusBarStyle.LightContent} này thực sự giúp: navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = true
Svitlana

Cảm tạ! Bạn đã cứu ngày của tôi. Tuy nhiên, BlackTranslucent không được dùng nữa. Do đó, tôi đã sử dụng navigationController.navigationBar.barStyle = .Black
hsusmita

Nó hoạt động hoàn hảo override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }. Bạn chỉ cần viết dòng này viewDidLoadcho tốt. Đảm bảo tiếp tục View controller-based status bar appearance = YESvới giải pháp này.
Bhavin_m

có vẻ như một overkill ... chỉ cần thử nó và làm việc như thế này trong tập tin Info.plist: 1. Tình trạng thanh phong cách -> UIStatusBarStyleLightContent 2. Xem điều khiển dựa trên thanh trạng thái xuất hiện -> NO
raistlin

21

Đối với iOS9.x và Xcode7, chỉ cần đặt bên trong AppDelegate.swift:

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

    UINavigationBar.appearance().barStyle = .Black

} 

Thao tác này sẽ tự động chuyển kiểu thanh trạng thái của bạn thành .Lightcontent cho tất cả các bộ điều khiển chế độ xem bên trong UINavigationController.

(Ngoài ra, hãy xóa View controller-based status bar appearancekhỏi Info.plist để ngăn chặn các cảnh báo mà bạn có thể đang thấy!)


cảm ơn bạn. Có vẻ như có một lỗi nghiêm trọng trong iOS9. Đây là cách duy nhất tôi có thể chuyển thanh trạng thái sang màu trắng VC ban đầu. Tôi đã thử mọi thứ. Tôi sẽ gửi một radar.
1b0t

favouriteStatusBarStyle trả về UIStatusBarStyleDefault nhưng không cập nhật lightcontent thành darkcontent cho viewcontroller cụ thể. Sau self.navigationController.navigationBar.barStyle = UIBarStyleDefault; trong viewWillAppear đã làm việc cho tôi. Hy vọng bình luận này sẽ giúp những người khác.
Pandey_Laxman

Lưu ý rằng UIStatusBarStyle đã được đổi thành ".black" (chữ thường B) trong Swift 3
brycejl

16

Trong Swift 3, kiểu thanh trạng thái đã thay đổi thành thuộc tính được tính toán trong UIViewController mà bạn có thể ghi đè như sau:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 

13

Trên iOS 9, phần sau (setStatusBarStyle) không được dùng nữa và bạn sẽ nhận được cảnh báo nếu bạn làm theo cách đó.

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

Nếu bạn muốn tất cả các thanh trạng thái được thay đổi trong một lần chụp, hãy thử thêm phần sau vào Info.plist của bạn. Điều này cũng sẽ làm cho thanh trạng thái màn hình khởi chạy của bạn có màu trắng. Trong khi đoạn mã trên thì không.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

Cách tiếp cận .plist là đúng, nhưng setStatusBarStyle () là không cần thiết. 'setStatusBarStyle (_: animation :)' không được dùng nữa trong iOS 9.0: Sử dụng - [UIViewController preferStatusBarStyle]
Bill Chan

@BillChan cảm ơn bạn đã bình luận nhưng hãy đọc câu trả lời đạt được. Tôi đã giải thích 'setStatusBarStyle' không được dùng nữa. Bạn nên sử dụng favouriteStatusBarStyle nếu bạn muốn thay đổi một hoặc một viewControllers khác. Phương pháp plist dành cho những ai muốn tất cả các ViewControllers được thay đổi trong một lần chụp. Không có đúng hay sai ở đây. Chỉ là vấn đề bạn cần đạt được gì.
GuiSoySauce

1
UIStatusBarStyle = UIStatusBarStyleLightContent (trong .plist) đã giúp ứng dụng của tôi khởi chạy với văn bản trên thanh trạng thái màu trắng ... Cảm ơn !!!
Chris Allinson

10

đối với tôi tất cả những điều trên không hoạt động cho đến khi tôi thêm:

self.navigationController?.navigationBar.barStyle = .black;

vì thế:

  1. Đặt UIViewControllerBasedStatusBarAppearancethành YEStrong.plist
  2. Đang viewDidLoadgọiself.setNeedsStatusBarAppearanceUpdate();
  3. Ghi đè ưu tiênStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. Trong phương pháp ghi đè, tôi cũng đặt giá trị navigationBar.barStylecuối cùng
    cho nội dung sáng :
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    và đối với nội dung đen sử dụng mặc định

Nguồn từ đâyđây .

và nếu điều này không hiệu quả, bạn có thể thử thêm UINavigationController extension:

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        if let lastVC = self.viewControllers.last
        {
            return lastVC.preferredStatusBarStyle
        }

        return .default
    }
}

1
Không có bình luận cho kiểu thanh điều hướng ... nhưng trong Swift 3, Xcode 8 - đây là giải pháp duy nhất phù hợp với tôi.
Despotovic

Hạn chế duy nhất tôi đã nhận thấy là với tất cả những bước nó thay đổi nhưng không có hình ảnh động
Lukasz 'Severiaan' Grela

6

Lạ thay, sử dụng Swift 3.1 & XC8.2.1, nhưng tất cả những điều trên không hoạt động.

Những gì tôi đã làm, chỉ là

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

Không có danh sách, không có thứ khác. HTH


Cũng hoạt động cho Swift 4.2.
zeeshan

2

Trong Swift 3.0, bạn có thể ghi đè một getter trong ViewController để xuất hiện thanh trạng thái dựa trên bộ điều khiển View:

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}

1

Không chỉnh sửa Info.plist của bạn. Thêm cái này vào ViewController.swift của bạn:

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

1

Bước 1. Thêm vào info.plist View controller-based status bar appearance -> NO

Bước 2. Thêm mã trong phương pháp mà bạn cần thay đổi màu thanh trạng thái:

UIApplication.shared.statusBarStyle = .lightContent //(or .default)
setNeedsStatusBarAppearanceUpdate()

Dòng mã chính: setNeedsStatusBarAppearanceUpdate()

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.