Thay đổi Màu thanh trạng thái cho các ViewControllers cụ thể bằng Swift trong iOS8


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

Sử dụng đoạn mã trên trong bất kỳ ViewContoder nào để đặt màu statusBar thành Trắng cho một trình điều khiển khung nhìn cụ thể không hoạt động trong iOS8 đối với tôi . Bất kỳ đề xuất? Sử dụng phương thức UIApplication. SharedApplication, màu sắc thay đổi sau khi thay đổi bắt buộc trong Info.plist cho toàn bộ ứng dụng.

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent

Làm cách nào tôi có thể thay đổi màu thanh trạng thái cho một số ViewControllers bắt buộc và cụ thể ?

Câu trả lời:


348

Sau khi đọc tất cả các đề xuất và thử một vài điều, tôi có thể làm cho nó hoạt động cho các trình điều khiển chế độ xem cụ thể bằng các bước sau:

Bước đầu tiên:

Mở thông tin của bạn.plist và chèn một khóa mới có tên " Xem sự xuất hiện của thanh trạng thái dựa trên bộ điều khiển " thành NO

Bước thứ hai (Chỉ cần giải thích, không cần thực hiện điều này):

Thông thường, chúng tôi đặt mã sau vào ứng dụng (phương thức _: didFinishLaunchingWithOptions :) của AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

nhưng điều đó ảnh hưởng đến statusBarStyletất cả các ViewControllers.

Vì vậy, làm thế nào để làm việc này cho ViewControllers cụ thể - Bước cuối cùng:

Mở tệp điều khiển khung nhìn nơi bạn muốn thay đổi statusBarStylevà đặt đoạn mã sau vào viewWillAppear(),

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

Ngoài ra, thực hiện viewWillDisappear()phương thức cho viewContoder cụ thể đó và đặt các dòng mã sau đây,

Swift 2

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default

}

Swift 3

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}

Bước này trước tiên sẽ thay đổi trình điều khiển statusBarStylekhung nhìn cụ thể và sau đó thay đổi trở lại defaultkhi trình điều khiển khung nhìn cụ thể biến mất. Không thực hiện viewWillDisappear()sẽ thay đổi statusBarStylevĩnh viễn thành giá trị được xác định mới củaUIStatusBarStyle.LightContent


4
Lưu ý rằng nếu bạn đặt Status bar is initially hidden = YEStrong tệp info.plist, "Xem thanh trạng thái dựa trên bộ điều khiển xuất hiện = NO" sẽ khiến thanh trạng thái bị ẩn.
xi.lin

13
Nếu bạn đang thay đổi trở lại UIStatusBarStyle.Defaultsử dụng viewWillDisappear(), bạn nên sử dụng viewWillAppear()để khởi tạo nó, thay vì viewDidLoad().... nếu không, nếu bạn quay lại chế độ xem đó mà không phải tải lại, bạn sẽ không thấy StatusBarStylebạn đang mong đợi.
William GP

7
Dành cho Swift 3: UIApplication.shared.statusBarStyle = .lightContent
ibrahimyilmaz

4
Vẫn chưa rõ cách bạn thay đổi màu của thanh trạng thái
DoruChidean

4
Các
ơi

108

(Kể từ ngày 20 tháng 9 năm 2019)

Swift 5 , Swift 4.2 , Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}

7
Đảm bảo gọi super.viewWillAppearnếu bạn sao chép và dán mã này
Stephen Silber

Đã chỉnh sửa để bao gồm super.viewWillAppear (). Cảm ơn @StephenSilber cho tiền boa!
BennyTheNerd

bạn phải ghi đè lênStatusStyle ưa thích nếu không nó sẽ không hoạt động. cảm ơn đã chỉ ra rằng +1
Alix

3
Sử dụng UIApplication.shared.statusBarStyle = .lightContentkết quả trong cảnh báo trình biên dịch này: Setter cho 'statusBarStyle' không được dùng nữa trong iOS 9.0: Sử dụng - [UIViewControll
preferStatusBarStyle

3
Trong Info.plist của ứng dụng của bạn, đặt "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" thành CÓ
IvanPavliuk

29

Tôi đã làm theo hướng dẫn này và nó đã làm việc cho tôi. Tuy nhiên, tôi không chắc chắn nếu có bất kỳ cảnh báo.

https://coderwall.com/p/dyqrfa/customize-navlation-bar-appparent-with-swift

  • Mở thông tin của bạn.plist và đặt UIViewControllerBasedStatusBarAppearancethành false.
  • Trong hàm đầu tiên AppDelegate.swiftchứa didFinishLaunchingWithOptions, đặt màu bạn muốn.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Cập nhật Swift 3 *

    Ứng dụng. Shared.statusBarStyle = .lightContent


11
Làm thế nào là cụ thể cho từng bộ điều khiển xem
Toweo

4
Chính xác, đây là cho ứng dụng hoàn chỉnh, và đó không phải là câu hỏi.
Anuj

3
Tôi đang sử dụng iOS 8 Swift và xCode 6.1.1 và chỉ cần làm theo hai bước này là không hoạt động. Bạn cũng cần thêm UIApplication.sharedApplication().statusBarHidden = falsevào AppDelegate.swift didFinishLauchingWithOptions
Ahmad Amin

Điều này đặt nó cho toàn bộ ứng dụng. Đối với bộ điều khiển xem cụ thể, xem câu trả lời đầu tiên. Nó làm việc cho tôi.
Akshar Patel

Setter cho 'statusBarStyle' không được dùng nữa trong iOS 9.0: Sử dụng - [UIViewControll preferStatusBarStyle]
Oleksandr

29

Giải pháp Swift 4.2 với NavigationContoder

Bước đầu tiên:

Mở thông tin của bạn.plist và chèn một khóa mới có tên " Xem giao diện thanh trạng thái dựa trên bộ điều khiển " hoặc UIViewControllerBasedStatusBarAppearancevào để cho mỗi VC sử dụng thuộc tính trạng thái riêng của chúng.

Bước thứ hai

Trong mỗi VC, ghi đè lên thuộc tính ưa thíchStatusBarStyle như thế này:

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent //.default for black style
}

Bước cuối cùng

Ghi đè thuộc tính ưa thíchStatusBarStyle trong lớp NavigationControll tùy chỉnh của bạn:

class NavigationController : UINavigationController {

override var preferredStatusBarStyle : UIStatusBarStyle {

    if let topVC = viewControllers.last {
        //return the status property of each VC, look at step 2
        return topVC.preferredStatusBarStyle  
    }

    return .default
}

Đây chỉ là cách để đạt được kết quả mong đợi bằng Bộ điều khiển Điều hướng và bộ điều khiển của riêng bạn. Ngoài ra, bạn có thể làm theo cách này để ưu tiênStatusBarHidden như tôi đã làm cho dự án của mình :)
atereshkov

22

Có một tỷ câu trả lời ở đây vì vậy tôi nghĩ tại sao không thêm câu trả lời khác dưới dạng tiện ích mở rộng (với sự trợ giúp từ @ Cœur)

Swift 3

Sự mở rộng:

extension UIApplication {
    class var statusBarBackgroundColor: UIColor? {
        get {
            return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
        } set {
            (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
        }
    }
}

Thực hiện:

UIApplication.statusBarBackgroundColor = .blue

2
Xin lưu ý rằng phương pháp này có thể được xem là truy cập API riêng và có thể có nghĩa là ứng dụng của bạn sẽ bị Apple từ chối.
JWhitey

Hoặc ít nhất, nó phụ thuộc vào chi tiết triển khai của Apple và có thể bị hỏng mà không có cảnh báo với những thay đổi trong iOS.
Hoàng tử Chris

19

Trong Info.plist của bạn, bạn cần xác định giao diện thanh trạng thái dựa trên bộ điều khiển Xem bất kỳ giá trị nào.

Nếu bạn xác định nó CÓ thì bạn nên ghi đè hàm ưa thíchStatusBarStyle trong mỗi bộ điều khiển xem.

Nếu bạn xác định nó KHÔNG thì bạn có thể đặt kiểu trong AppDelegate bằng cách sử dụng

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

7
setStatusBarStyleđã bị phản đối trong iOS 9.0
Jeffrey Neo

@Jeffrey_Neo Mặc dù điều đó đúng nhưng tôi không thể thay thế để làm việc. Sẽ rất hữu ích khi xem bình luận của bạn như một câu trả lời với mã làm việc.
dumbledad

15
override func viewWillAppear(animated: Bool) {
    self.navigationController?.navigationBarHidden =  true

    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
    if statusBar.respondsToSelector("setBackgroundColor:") {
        statusBar.backgroundColor = UIColor.redColor()
    }

}

việc sử dụng valueForKey("statusBar")có thể không tuân thủ các nguyên tắc của Apple
Cur

15

Swift 3

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
  statusBar.backgroundColor = UIColor.black
} 

Đó là giải pháp thiết lập màu nền của thanh trạng thái cho bộ điều khiển xem cụ thể.


3
UIView luôn phản hồi với nềnColor trong Swift.
Cœur

13

Chuyển 2

Tôi đã có thể thay đổi thành công sự xuất hiện của nền thanh trạng thái bằng cách thêm vào phần sau trong viewWillAppear của tôi:

let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }

10

Thực hiện preferredStatusBarStylenhư bạn đề cập đến và cuộc gọi self.setNeedsStatusBarAppearanceUpdate()trong ViewDidLoadvà cũng trong Info.plist bộ UIViewControllerBasedStatusBarAppearanceđến YES(Đó là YEStheo mặc định)

Không rõ lý do tại sao nó không hoạt động. Tôi cần kiểm tra mã. Một đề nghị khác là sử dụng mã làm việc viewDidLoad UIApplication.sharedApplication().statusBarStyle = .LightContentvà thay đổi nó thành mặc định khi bạn xem biến mất viewWillDisappear.


Chỉ cần thực hiện phần đầu tiên của câu trả lời, làm việc cho tôi. Tuy nhiên, tôi đã không thêm UIViewcontrollBasingStatusBarAppparent trong Info.plist. Nó vẫn hoạt động.
Akshar Patel

10

cho nhanh 3

.

View controller-based status bar appearance = NO

AppDelegate.swift

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Custom statubar
        UIApplication.shared.isStatusBarHidden = false
        UIApplication.shared.statusBarStyle = .lightContent
        let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
        statusBar.backgroundColor = UIColor.gray

        return true
    }

1
Tôi đã thử tất cả các giải pháp ... điều này chỉ hiệu quả với tôi !! Tôi không biết tại sao: D
Khaled Hayek

may mắn của trận hòa
Giang

Setter cho 'isStatusBarHidden' không được dùng nữa trong iOS 9.0: Sử dụng - [UIViewControll thíchStatusBarHidden] ...
đã vẽ ..

9

Trong tình huống của tôi, tôi sử dụng bảng phân cảnh để tổ chức các bộ điều khiển xem của mình. Tôi muốn thay đổi tất cả các kiểu thanh trạng thái.

Bạn có thể thấy trong hình dưới đây.

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

StarsXem điều khiển là một CPBaseNavigationController, và CPBaseNavigationControllerlà lớp con của UINavigationController.

Tôi cố gắng thực hiện các setps tiếp theo:

  1. Trong AppDelegate.swiftfunc didFinishLaunchingWithOptions, thêm

    //change status bar color
    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent

    nhưng không có tác dụng.

  2. Trong StoryBoard, tìm Base Tab BarController(hình trên). Chọn Attributes Inspector, thay đổi Sattus Barthuộc tính thành Light Content.so xấu, không có hiệu lực.

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

  1. Cuối cùng tôi nhận được nó. Trong bộ điều khiển điều hướng tùy chỉnh của tôi CPBaseNavigationController, thêm funcpreferredStatusBarStyle

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

    Nó hoạt động tốt!

Bên cạnh đó, statusBarStylekhông dùng nữa trong 9.0, bạn có thể sử dụng -[UIViewController preferredStatusBarStyle].


9

Hoạt động cho ứng dụng dựa trên điều hướng

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)

Nơi để thêm mã cụ thể này, chỉ không thể làm cho nó hoạt động.
Anuj

Bạn có thể thêm nó vào tệp đại biểu ứng dụng trong didFinishLaunchingWithOptions
Jio

1
Sẽ tốt hơn nếu sử dụng addStatusBar.frame = CGRectMake (0, 0, UIScreen.mainScreen (). Bound. Thong, 20) thay vì độ rộng 320 được mã hóa cứng?
Torsten Ojaperv

Đã chỉnh sửa @TorstenOjaperv
Jio

Làm thế nào để làm điều đó với swift 3.0?
YETI

8

Mọi thứ dễ dàng hơn nhiều trong Swift 3.0 Xcode 8

Sử dụng mã dưới đây trong tệp Đại biểu ứng dụng, sau

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

chèn cái này:

UINavigationBar.appearance().barStyle = .black

UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)

1
Các giá trị đỏ, lục và lam nằm trong khoảng từ 0 đến 1. Bạn phải chia chúng cho 255 nếu không nó sẽ không hoạt động.
Makalele

8

Swift 3

//
//  LoginController.swift
//  Swift 3
//
//  Created by The Crab on 17/01/2017.
//  Copyright © 2017 Paxi Labs. All rights reserved.
//

import UIKit

class LoginController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setNeedsStatusBarAppearanceUpdate()

        view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1)

    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

7

Swift 4 Đối với ViewContoder cụ thể không có navigationViewControll được nhúng, chỉ cần thêm phần này vào tệp ViewContoder của bạn.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Nếu chúng ta có một bộ điều khiển điều hướng nhúng, bạn sẽ làm gì?
icekomo

7

Một cách thực sự dễ dàng khác để thực hiện công việc này chỉ là tạo một phần mở rộng của lớp UINavestionControll.

Vì ghi đè preferredStatusBarStyle:phương thức sẽ không hoạt động KHÔNG GIỚI HẠN, chúng tôi thực hiện bên trong lớp UINavestionControll.

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

4

Tôi đã đặt màu cụ thể (ở định dạng RGB) bằng mã bên dưới trong App Delegatetệp:

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

 UIApplication.sharedApplication().statusBarHidden = false
        UIApplication.sharedApplication().statusBarStyle = .LightContent

        let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
        if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
            statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0)
        }

. . .
}

Bạn cũng cần thêm khóa dưới đây trong Info.plisttệp:

Xem sự xuất hiện của thanh trạng thái dựa trên bộ điều khiển với giá trị boolean được đặt thành NO

Ảnh chụp màn hình 1

Ảnh chụp màn hình 2


Với Siwft 3.0, làm thế nào để làm điều đó?
YETI

4

Tôi có thể đề nghị bạn một cách đơn giản hơn,

  1. Chỉ cần gọi setNeedStatusBarAppparentUpdate trong viewDidLoad như tài liệu của Apple nói,

Gọi phương thức này nếu các thuộc tính trên thanh trạng thái của trình điều khiển xem, chẳng hạn như trạng thái hoặc kiểu ẩn / không được ẩn, thay đổi. Nếu bạn gọi phương thức này trong một khối hoạt hình, các thay đổi sẽ được làm động cùng với phần còn lại của khối hoạt hình.

  1. Triển khai ưu tiênStatusBarStyle trả về loại ưa thích của bạn.

Nó hoạt động với tôi trong iOS 10.1.

Mục tiêu C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Nhanh

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Tôi ngạc nhiên không ai chỉ ra điều này. Dù sao hãy tận hưởng :)


4

Tôi đã có một số rắc rối với điều này. Tôi thực sự không cảm thấy tốt về việc thay đổi màu sắc trên thanh trạng thái trên toàn cầu đã xuất hiện và sau đó thay đổi lại về chế độ xem đã biến mất như câu trả lời được chấp nhận. Tin hay không bạn có thể làm việc này bằng cách ghi đè preferredStatusBarStylelên bộ điều khiển xem mong muốn của bạn. Sau nhiều thời gian, đây là những gì tôi đã làm để nó hoạt động:

  1. Thay đổi giao diện thanh trạng thái dựa trên bộ điều khiển Xem info.plistthành CÓ.
  2. Bây giờ bất kỳ trình điều khiển xem toàn màn hình có thể thay đổi kiểu thanh trạng thái bằng cách ghi đè preferredStatusBarStyle.
  3. Tôi chỉ định toàn màn hình vì điều này sẽ không hoạt động đối với các bộ điều khiển chế độ xem chế độ (không toàn màn hình), không phải không có cài đặt modal​Presentation​Captures​Status​Bar​Appearancethành Có.
  4. Ngoài ra, nếu bạn có các bộ điều khiển xem được nhúng, chẳng hạn như trong bộ điều khiển điều hướng, nó sẽ hỏi bộ điều khiển xem nhiều nhất cho kiểu thanh trạng thái. Ghi đè child​View​Controller​For​Status​Bar​Stylevà chuyển qua trình điều khiển chế độ xem nhúng được cho là hoạt động nhưng nó không phù hợp với tôi. Vì vậy, tôi chỉ trả về thanh trạng thái ưa thích của trình điều khiển xem nhúng như kiểu thanh trạng thái ưa thích. Một cái gì đó như thế này:

    override var preferredStatusBarStyle: UIStatusBarStyle {
         if let topViewController = viewControllers.last {
             return topViewController.preferredStatusBarStyle
         }
    
         return .default
    }

Câu trả lời này đã giúp tôi! Tôi thấy rằng vì một số lý do, bộ điều khiển điều hướng của tôi (được trình bày một cách vừa phải) không hoàn toàn hỏi bộ điều khiển xem nhiều nhất cho kiểu thanh trạng thái của nó. Vì vậy, tôi đã phải phân lớp UINavigationControllervà ghi đè child​View​Controller​For​Status​Bar​Stylevar trong đó, trở lại self.topViewController.
taber

3

Trong Swift 4 hoặc 4.2

Bạn có thể thêm vào vc của bạn

ưa thíchStatusBarStyle

và đặt giá trị trả về là

.lightContent hoặc .default

Ví dụ:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}

3

(Kể từ ngày 10 tháng 6 năm 2020)

Swift 5 ( Không cần chỉnh sửa .Plisttệp )

Nếu bạn đang sử dụng Storyboard, đi đến NavigationController, chọn navigationBar, nhấp vào Attributes Inspector, sau đó thay đổi style. nếu bạn cần light content( thanh trạng thái màu trắng ) hãy đặt bất cứ thứ gì ngoại trừ defaultcho phép nói kiểu đặt blackVà nếu bạn muốn dark content ( thanh trạng thái màu đen ) hãy đặt nódefault .

Mặc định ( UIBarStyleDefault) dẫn đến UIStatusBarStyleDefaultthanh trạng thái nền trước tối . Và UIBarStyleBlacksẽ đưa ra một UIStatusBarStyleLightContentthanh trạng thái.

Có lập trình

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar

Không có thanh điều hướng ( Chỉnh sửa.Plist )

thêm UIViewControllerBasedStatusBarAppearance/ View controller-based status bar appearancevào của bạn info.plistvà đặt giá trị là true.

Overridecác preferredStatusBarStyletài sản trong điều khiển của bạn

class ViewController: UIViewController {
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}

2

Cập nhật Swift 3.0

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }

2

Những gì hoạt động với tôi, trong Bảng phân cảnh, đi đến Trình điều khiển điều hướng, chọn thanh điều hướng, nhấp vào Trình kiểm tra thuộc tính, sau đó thay đổi kiểu từ mặc định sang màu đen. Đó là nó!


2

Chuyển đổi 4.2 Này, tôi muốn chia sẻ một giải pháp, nó hiệu quả với tôi mà tôi đã nhận được từ một bài viết tuyệt vời về chủ đề khó nắm bắt này của Graig Grummitt.

Bước 1 Như những người khác đã đề cập THÊM bên dưới cho PLIST của bạn

View controller-based status bar appearance YES

Bước 2 trong phần bổ sung RootViewcontroll bên dưới

var statusBarHidden: Bool = false {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var prefersStatusBarHidden: Bool {
        return statusBarHidden
    }

    var vcStatusBarStyle: UIStatusBarStyle = .default {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return vcStatusbarStyle
    }

Khi cập nhật một trong hai thuộc tính statusBarHiddenhoặc vcStatusBarStylenó sẽ gọi setNeedsStatusBarAppearanceUpdate()và sẽ cập nhật thanh trạng thái với các giá trị mới cho một trong hai prefersStatusBarHiddenhoặc preferredStatusBarStyle. Trong tình huống của tôi, tôi đã phải cập nhật các thuộc tính này cho trình điều khiển khung nhìn container, đó là cha mẹ của trình điều khiển quan sát con có thể nhìn thấy. Tôi đã làm điều này bằng một phương pháp đại biểu đơn giản.

protocol MainViewControllerDelegate {
    func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
    func toggleStatusBar(visable: Bool)
}

Tất nhiên, khi khởi tạo childViewControll (VC có thể nhìn thấy) đừng quên đặt MainViewcontroll (Container VC) làm đại biểu. Tôi đôi khi làm. :)

childViewController.delegate = self

Sau đó, trong childViewControll tôi chỉ gọi phương thức ủy nhiệm khi cần cập nhật thanh trạng thái.

self.delegate?.updateStatusBarStyle(statBarStayle: .default)

Như đã đề cập ở trên, Graig Grummitt đi sâu vào chi tiết hơn về giải pháp này và cũng làm việc với UINavestionControllers. Liên kết tại đây: Trường hợp bí ẩn của Thanh trạng thái


1

Nhấp vào nhóm Tệp hỗ trợ (phía trên bên trái - tên dự án của bạn). Điều hướng đến Thông tin. Nhấp vào + ở đâu đó giữa các danh sách, như tên gói bên dưới. Và thêm "Xem sự xuất hiện của thanh trạng thái dựa trên bộ điều khiển" và đặt thành NO. Sau đó mở AppDelegate.swift và sửa đổi như thế này:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

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

return true
}

Đó là nó.


Bạn đọc sai câu hỏi. Tôi đã hỏi về cách thay đổi StatusBarStyle cho các trình điều khiển khung nhìn cụ thể, không phải cho ứng dụng hoàn chỉnh.
Anuj

Kiểm tra câu trả lời của tôi dưới đây @Anuj
theCrab

1

Đối với Xcode 10, bạn có thể tạo một lớp và đặt nó trước lớp viewContoder của bạn, bạn có thể gọi lớp này trong tất cả các trình điều khiển xem là cần một thanh trạng thái nội dung nhẹ ...

class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}

Bây giờ thay đổi lớp viewControll của bạn trong:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

Và đó là tất cả...


1

Hoạt động cho Điều hướng Dựa trên bộ điều khiển xem cụ thể trong swift4

   let app = UIApplication.shared
   let statusBarHeight: CGFloat = app.statusBarFrame.size.height

   let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
   statusbarView.backgroundColor = UIColor.red
   view.addSubview(statusbarView)

1

CẢNH BÁO


Setter cho 'statusBarStyle' không được dùng nữa trong iOS 9.0: Sử dụng - [UIViewControll preferStatusBarStyle]

UIApplication.shared.statusBarStyle = .default

vì vậy giải pháp của tôi là như thế này: tạo một phần mở rộng từ bộ điều khiển điều hướng:

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

        return .default
    }
}

và nếu bạn có viewContoder sẽ có kiểu khác với kiểu của ứng dụng, bạn có thể tạo kiểu này

var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
    return barStyle
}

giả sử rằng kiểu trạng thái ứng dụng của bạn là .defaultvà bạn muốn màn hình này là .lightContent barStyle sẽ lấy .lightContentgiá trị mặc định của nó, điều này sẽ thay đổi kiểu thanh trạng thái thành lightContent, và sau đó đảm bảo khi viewWillDisappearthay đổi lại barStyle thành kiểu thanh trạng thái ứng dụng mà trong trường hợp của chúng tôi là .default.

đây là công việc cho tôi


1

Màu tùy chỉnh cho thanh trạng thái (iOS11 +, Swift4 +)

Nếu bạn đang tìm kiếm một giải pháp làm thế nào để thay đổi thanh trạng thái thành màu tùy chỉnh của bạn, thì đây là giải pháp làm việc.

let statusBarView = UIView()
view.addSubview(statusBarView)
statusBarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    statusBarView.topAnchor.constraint(equalTo: view.topAnchor),
    statusBarView.leftAnchor.constraint(equalTo: view.leftAnchor),
    statusBarView.rightAnchor.constraint(equalTo: view.rightAnchor),
    statusBarView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
statusBarView.backgroundColor = .blue
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.