Cách đặt Kiểu thanh trạng thái trong Swift 3


186

Tôi đang sử dụng Xcode 8.0 beta 4.

Trong phiên bản trước, UIViewControll có phương thức đặt kiểu thanh trạng thái

public func preferredStatusBarStyle() -> UIStatusBarStyle

Tuy nhiên, tôi thấy nó đã thay đổi thành "Chỉ có thể thay đổi" trong Swift 3.

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

Làm cách nào để cung cấp kiểu để sử dụng trong UIViewControll của tôi?


thử var này preferredStatusBarStyle: UIStatusBarStyle = .lightContent
Anbu.Karthik

Câu trả lời:


484

[CẬP NHẬT] Dành cho Xcode 10+ & Swift 4.2+

Đây là phương pháp ưa thích cho iOS 7 trở lên

Trong ứng dụng của bạn Info.plist, được đặt View controller-based status bar appearancethành YES.

Ghi đè preferredStatusBarStyle ( tài liệu Apple ) trong mỗi bộ điều khiển xem của bạn. Ví dụ:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

Nếu bạn đã preferredStatusBarStyletrả về một kiểu thanh trạng thái ưa thích khác dựa trên thứ gì đó thay đổi bên trong bộ điều khiển chế độ xem của bạn (ví dụ: vị trí cuộn hoặc hình ảnh hiển thị có tối không), thì bạn sẽ muốn gọi setNeedsStatusBarAppearanceUpdate()khi trạng thái đó thay đổi.

iOS trước phiên bản 7, phương pháp không dùng nữa

Apple đã phản đối điều này , vì vậy nó sẽ bị xóa trong tương lai. Sử dụng phương pháp trên để bạn không phải viết lại khi phiên bản iOS tiếp theo được phát hành.

Nếu ứng dụng của bạn sẽ hỗ trợ Trong ứng dụng của bạn Info.plist, hãy đặt View controller-based status bar appearancethành NO.

Trong appDelegate.swift, didFinishLaunchingWithOptionshàm, thêm:

UIApplication.shared.statusBarStyle = .lightContent

Đối với điều khiển điều hướng

Nếu bạn sử dụng bộ điều khiển điều hướng và bạn muốn kiểu thanh trạng thái ưa thích của từng bộ điều khiển chế độ xem được sử dụng và được đặt View controller-based status bar appearancethành YEStrong ứng dụng của bạninfo.plist

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

3
Làm việc cho tôi. Quên chèn cài đặt mới vào Info.plist trước.
falsecrypt

1
@LightMan trạng thái uiapplicationBarStyle không bị phản đối, tôi đã sử dụng điều này trong iOS 11 và nó hoạt động.
Sushobhit

1
@Sushobhit setStatusBarStyle không được dùng trong iOS 9, như được sử dụng trong câu trả lời này. Nhưng bạn vẫn có UIApplication.statusBarStyle như một tài sản chỉ đọc.
Lightman

1
Đôi khi bạn muốn có thể thiết lập chương trình do màu sắc của mỗi chế độ xem.
Alejandro Cavazos

9
Bạn cũng có thể xóa dòng trong appDelegate.swift và đi đến Target -> General -> Deployment Info -> Status Bar Style -> Light
Robert Veringa

162

Cập nhật mới nhất (Xcode 10+ / Swift 4.2+)

Bài viết này được giữ nguyên cho bất kỳ ai sẵn sàng hiểu logic đằng sau các cách tiếp cận khác nhau đã có mặt trong nhiều năm qua. Trong khi đó, tính đến Xcode 10, Swift 4.2 Cách tiếp cận đầu tiên bị phản đối và không còn được hỗ trợ (tức là sẽ không có hiệu lực nếu bạn cố gắng sử dụng nó). Nó vẫn được giới thiệu cho thông tin của bạn để hiểu rõ hơn lý do đằng sau Plist.infocờ và tùy chỉnh thực hành.

Làm rõ quan trọng

Điều rất quan trọng để hiểu hai cách tiếp cận để tùy chỉnh sự xuất hiện của thanh trạng thái. Chúng khác nhau và không nên trộn lẫn.

Cách tiếp cận đầu tiên - một màu cho toàn bộ ứng dụng (ĐÃ ĐỔI kể từ iOS7)

Trong info.plist bạn tìm hoặc tạo một khóa được gọi là

View controller-based status bar appearance

và đặt nó thành NO .

Những gì nó làm? Về cơ bản, nó thiết lập một cài đặt cho biết rằng trong ứng dụng của bạn, giao diện thanh trạng thái không được xác định riêng lẻ bởi mỗi bộ điều khiển chế độ xem . Điều này là siêu quan trọng để hiểu. Điều này có nghĩa là bạn có cài đặt thống nhất cho toàn bộ ứng dụng, cho tất cả các màn hình. Có hai cài đặt : default, đó là văn bản màu đen trên nền trắng hoặc lightContentvăn bản màu trắng trên nền đen.

Để thiết lập một trong số này ( một cài đặt cho tất cả các màn hình ):

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent // .default
    return true
}

Bằng cách này, bạn sẽ không cần phải thiết lập lại cài đặt này trên mỗi bộ điều khiển chế độ xem. Tuy nhiên, bạn luôn có thể dùng đến phương pháp này để tự nguyện thay đổi ngoại hình.

Cách tiếp cận thứ hai - màu riêng cho từng bộ điều khiển xem

Điều này ngược lại. Để làm cho nó hoạt động, hãy tiếp tục với info.plist và thiết lập

View controller-based status bar appearance

để

Theo cách này, bất cứ khi nào một trình điều khiển chế độ xem mới được mở, kiểu thanh trạng thái được đặt riêng nếu bạn chèn triển khai này trong mỗi UIViewControllertrường hợp bạn cần:

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

Bạn có giống như trong lần đầu tiên, đặt kiểu tối hoặc sáng cho thanh trạng thái, riêng cho từng bộ điều khiển chế độ xem.

Khách sạn này được UIKit tìm nạp theo hai trường hợp:

  1. Khi khởi tạo màn hình, khi UI đang được chuẩn bị.
  2. Khi gọi setNeedsStatusBarAppearanceUpdate()mã.

Trong trường hợp sau, bạn đủ điều kiện để thao tác xuất hiện trên thanh trạng thái theo mã sau:

var isDark = false {
    didSet {
        setNeedsStatusBarAppearanceUpdate()
    }
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return isDark ? .lightContent : .default
}

func toggleAppearance() {
   isDark.toggle()
}

Sau đó, bất cứ khi nào bạn gọi toggleAppearance() , thay đổi kiểu thanh trạng thái sẽ được kích hoạt.

Cách tiếp cận thứ ba - Hack!

Có một hack cho phép truy cập thanh trạng thái trực tiếp:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
    if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
        statusBar.backgroundColor = UIColor.blue
    }
    
    return true
}

Tại sao hack? Nếu bạn cần màu thanh trạng thái khác với màu đen hoặc trắng, bạn sử dụng API không có giấy tờ. Bạn nhận được statusBarđối tượng bằng KVC và đặt màu nền của nó. Đối tượng bạn có được theo cách này là UIStatusBar, có nguồn gốc từ UIViewvà do đó tự nhiên hỗ trợ backgroundColortài sản. Đây là cách bẩn, không hợp pháp, nhưng cho đến nay, đó là cách duy nhất để thiết lập màu tùy chỉnh cho thanh trạng thái (không tính đến UINavigationBarcách tiếp cận tài khoản , cho phép tùy chỉnh hoàn toàn sự xuất hiện của thanh điều hướng + thanh trạng thái). Nó cũng có thể dẫn ứng dụng của bạn bị từ chối. Nhưng có lẽ bạn may mắn. Và nếu bạn, trong một số trường hợp phức tạp (như hệ thống phân cấp của bộ điều khiển lồng nhau, điều hướng con và điều khiển xem) thì đây có thể là cách duy nhất, hoặc ít nhất là cách ít rắc rối hơn để tùy chỉnh giao diện thanh trạng thái (ví dụ: để làm cho nó trong suốt)

Xcode 10+, Swift 4.2

Không còn lựa chọn nào khác: nhà phát triển nên để mỗi bộ điều khiển khung nhìn xác định diện mạo của thanh trạng thái, bằng cách đặt cờ thành (hoặc bỏ qua hành động này, vì theo mặc định là CÓ) và làm theo các hướng dẫn ở trên.


Tặng kem

Giải pháp dựa trên hack mà bạn có thể (mặc dù không được khuyến khích) sử dụng trong các trường hợp phức tạp để tự nguyện thay đổi giao diện thanh trạng thái ở bất kỳ giai đoạn nào. Màu sắc khôn ngoan, phương pháp mở rộng sau đây thực hiện chính xác những gì bạn có thể làm với phương pháp thông thường. Bạn có thể điều chỉnh nó theo nhu cầu của bạn.

extension UIViewController {
    func setStatusBarStyle(_ style: UIStatusBarStyle) {
        if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
            statusBar.backgroundColor = style == .lightContent ? UIColor.black : .white
            statusBar.setValue(style == .lightContent ? UIColor.white : .black, forKey: "foregroundColor")
        }
    }
}

2
Khi bạn có thanh trạng thái, bạn cũng có thể thực hiện việc này: statusBar.setValue (UIColor.red, forKey: "foregroundColor"); hoặc sử dụng bất kỳ khóa hiện có nào để đặt bất kỳ thuộc tính nào có sẵn cho UIStatusBar nhưng không dành cho UIView
Đánh dấu

application.statusBarStyle = .lightContent cách tiếp cận này nói chung là do iOS9> Setter cho 'statusBarStyle' không được chấp nhận trong iOS 9.0: Sử dụng - [UIViewControll ưa
thíchStatusBarStyle

Đây là lần duy nhất nó hoạt động ở đây khi thay đổi chủ đề màu của ứng dụng. Tuy nhiên, dường như, một khi điều này đã được đặt, bạn luôn phải đặt lại khi chuyển đổi bộ điều khiển xem. Phương thức ưa thíchStatusBarStyle () được bỏ qua từ đây trở đi (ngay cả với cài đặt thích hợp trong info.plist).
độc đáo

2
Câu trả lời này là mô tả nhiều hơn so với những người khác.
ViruMax

2
Giải pháp tiền thưởng bị hỏng trong iOS 13.1
ViruMax

130

Bạn có thể cố gắng ghi đè giá trị được trả về, thay vì đặt nó. Phương thức được khai báo là {get}, vì vậy chỉ cần cung cấp một getter:

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Nếu bạn đặt điều kiện này, bạn sẽ cần gọi setNeedsStatusBarAppearanceUpdate()để nó sẽ tạo hiệu ứng thay đổi khi bạn sẵn sàng


2
Đây là một cách tiếp cận tốt hơn khi bạn có thể chọn prefersStatusBarHiddencho một số quan điểm của mình. Nếu bạn đang đi với UIApplication.shared.statusBarStylebạn sẽ bị mắc kẹt với nó.
superarts.org

105

Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
Đối với tôi, phương pháp này không hoạt động:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

khi tôi sử dụng cho mỗi trình điều khiển xem, nhưng điều này đã làm việc:

  • Trong tệp thông tin.list, thêm hàng: View controller-based status bar appearancevà đặt thànhNO

  • Tiếp theo trong appdelegate:

    UIApplication.shared.statusBarStyle = .lightContent

Tôi đã cố gắng chỉ sau khi thêm mã cho đại biểu ứng dụng, nhưng cài đặt thông tin là hữu ích cho tôi. Cảm ơn bạn
Akhilesh Sharma

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

33

Nếu bạn muốn thay đổi statusBarmàu của màu trắng thành màu trắng, đối với tất cả các chế độ xem có trong a UINavigationController, hãy thêm màu này vào bên trong AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .blackOpaque
    return true
}

Mã này:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

không làm việc cho UIViewControllerschứa trong một UINavigationController, bởi vì ngoại hình trình biên dịch cho statusBarStylecác UINavigationController, không phải vì statusBarStylecácViewControllers chứa trong nó.

Hy vọng điều này sẽ giúp những người chưa thành công với câu trả lời được chấp nhận!


Vâng, cảm ơn bạn rất nhiều! Bộ điều khiển điều hướng là một chút sắc thái mà nhiều người không xem xét!
Alexis Candelaria

26

Nếu bạn muốn thay đổi kiểu thanh trạng thái bất cứ lúc nào sau khi chế độ xem xuất hiện, bạn có thể sử dụng:

  • Trong tệp thông tin.list thêm hàng: Xem giao diện thanh trạng thái dựa trên bộ điều khiển và đặt thành

    var viewIsDark = Bool()
    
    func makeViewDark() {
    
        viewIsDark = true
        setNeedsStatusBarAppearanceUpdate()
    }
    
    func makeViewLight() {
    
        viewIsDark = false
        setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
    
        if viewIsDark {
            return .lightContent 
        } else {
            return .default 
        } 
    }

1
If you call this method within an animation block, the changes are animated along with the rest of the animation block.
Alexandre G

25

Bạn cần thêm khóa bên dưới vào tệp Info.plist của mình:

View controller-based status bar appearance với giá trị boolean được đặt thành NO

Trong lớp appdelegate của bạn, trong didFinishLaunchingWithOptionsphương thức trước khi trở về.

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

thay đổi backgroundColorstatusBarStyletheo yêu cầu.


Giải pháp tuyệt vời, nhưng điều này có được tính là sử dụng API riêng không?
GoldenJoe

Hoạt động tốt nhưng làm thế nào tôi có thể thay đổi màu tùy chỉnh?
iSrinivasan27

@MohanSrinivasan thay vì "UIColor.red", bạn có thể chỉ định màu tùy chỉnh cho mình.
Himanshu padia

25

Xcode 10 trở lên

Đã thử nghiệm trong Swift 5

Không có mã yêu cầu chỉ cần làm theo các bước dưới đây.

Nếu bạn muốn thay đổi thanh trạng thái trong toàn bộ ứng dụng.

  1. Chọn Project từ Project Navigator (bảng điều khiển bên trái).
  2. Chọn mục tiêu.
  3. Chọn tab Chung.
  4. Tìm thông tin triển khai.
  5. Thay đổi kiểu thanh trạng thái thành Ánh sáng (đối với nền tối "Ánh sáng" , Nền sáng "Mặc định" )

Đừng quên thông tin. Thay đổi thông tin

  1. Chọn tab Thông tin
  2. Thêm khóa này vào tệp plist của bạn "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" = NO

Chạy dự án của bạn và kiểm tra nó.

Dự án của tôi trong swift 5 và Xcode 10.2 & 11.0


Đối với Xcode 10 / Swift5, đây sẽ là câu trả lời được chấp nhận. Bạn phải làm cả hai bước để làm việc này.
John Robi

Hoàn hảo. Cảm ơn bạn! Tôi đồng ý rằng đây sẽ là câu trả lời được chấp nhận thực tế.
DungeonDev

Đây là câu trả lời hoàn hảo
nikhilgohil11

Điều này hoàn toàn cũng hoạt động với xcode 11 với swift 5, cảm ơn
Luis Santiago

13

Bạn cũng có thể làm điều này trong bảng phân cảnh

  1. Tạo một mục mới trong info.plist "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" đặt nó thành "CÓ".
  2. Chuyển đến bảng phân cảnh của bạn và sau đó chọn bộ điều khiển điều hướng mà bạn muốn thay đổi. Nhấp vào thanh điều hướng từ phần phác thảo tài liệu Storyboard (bảng bên trái trên bảng phân cảnh)
  3. Đi đến bảng bên phải và nhấp vào phần thuộc tính
  4. Trong phần Thanh điều hướng, bạn sẽ thấy phong cách. Chọn kiểu bạn muốn (mặc định là màu đen và màu đen là màu trắng)

Bạn sẽ phải làm điều này cho mỗi bộ điều khiển điều hướng bạn có. Tuy nhiên, bất kỳ chế độ xem nào trong bộ điều khiển điều hướng đó sẽ thay đổi tất cả kiểu / màu của thanh trạng thái thành giao diện bạn vừa chọn. Tôi thấy tùy chọn này tốt hơn vì bạn có thể thấy kết quả của mình ngay lập tức và không phải thêm các dòng mã bổ sung trong mỗi bộ điều khiển xem.

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

(Hoàn thành với Xcode 8.3.3 trong một dự án Swift)


"Xem giao diện thanh trạng thái dựa trên bộ điều khiển" nên được đặt thành "KHÔNG"
Willjay

2
Cách rất sạch để đặt kiểu thanh trạng thái theo nội dung của Trình điều khiển xem, đây là cách chính xác thay vì chỉ cài đặt View controller-based status bar appearance = NOvà chỉ phải sử dụng kiểu sáng hoặc tối trong toàn bộ ứng dụng. Thật đáng tiếc khi cách "Không mã hóa" này chỉ hoạt động trong Bộ điều khiển Điều hướng, Apple nên xem xét thêm một trường khác để đặt tùy chọn này bên trong bất kỳ phiên bản Trình điều khiển xem nào.
aldoram5

12

Đối với những người đang tìm cách thay đổi thanh trạng thái cho tất cả các trình điều khiển chế độ xem trên: iOS 11, giải pháp Swfit 4/5 khá dễ dàng.

1) Info.plist thêm:

Xem sự xuất hiện của thanh trạng thái dựa trên bộ điều khiển -> KHÔNG

2) Bên trái của dự án cắt XCode> Mục tiêu > Chọn dự án của bạn> Dưới Chung> Thông tin triển khai> Chọn Kiểu thanh trạng thái: Ánh sáng

Nếu bạn muốn thay đổi thanh trạng thái chỉ cho một trình điều khiển , trên viewDidLoad thêm:

2.1 ) Thông tin.

Xem sự xuất hiện của thanh trạng thái dựa trên bộ điều khiển -> CÓ

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Mục tiêu-C (hoặc phản ứng tự nhiên) thay đổi từ Đại biểu ứng dụng:

1) Info.plist thêm:

Xem sự xuất hiện của thanh trạng thái dựa trên bộ điều khiển -> KHÔNG

2) AppDelegate -> didFinishLaunchingWithOptions

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];

Thay đổi thanh trạng thái không hoạt động khi cố gắng đẩy (bộ điều khiển điều hướng), chỉ khi trình bày các trình điều khiển chế độ xem theo phương thức.


8

Bước đầu tiên bạn cần thêm một hàng với khóa: View controller-based status bar appearancevà giá trị NOcho Info.plisttệp. Sau đó, thêm 2 chức năng trong bộ điều khiển của bạn vào chỉ cụ thể bộ điều khiển đó sẽ có hiệu lực:

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       UIApplication.shared.statusBarStyle = .lightContent
}

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

6

Swift 3

Trong Info.plist, thêm một hàng có tên "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" và đặt giá trị của nó thành No.

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

    }

}

6

Dường như có một vấn đề nhỏ về màu văn bản của thanh trạng thái khi xử lý các thanh điều hướng.

Nếu bạn muốn mục .plist Xem giao diện thanh trạng thái dựa trên bộ điều khiển được đặt thành YES , đôi khi nó sẽ không hoạt động khi bạn có thanh điều hướng màu.

Ví dụ:

override func viewWillAppear(_ animated: Bool) {
    let nav = self.navigationController?.navigationBar
    nav?.barTintColor = .red
    nav?.tintColor = .white
    nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

Mã ở trên sẽ không hoạt động ngay cả khi bạn đã đặt phần sau trong AppDelegate:

UIApplication.shared.statusBarStyle = .lightContent

Đối với những người vẫn đang vật lộn, rõ ràng nó bằng cách nào đó phán đoán nếu thanh trạng thái cần phải sáng hoặc tối bởi các kiểu trong thanh điều hướng. Vì vậy, tôi đã cố gắng khắc phục điều này bằng cách thêm dòng sau vào viewWillAppear:

nav?.barStyle = UIBarStyle.black

Khi kiểu thanh màu đen, thì nó lắng nghe biến bị ghi đè của bạn. Hy vọng điều này sẽ giúp được ai đó :)


5

Xcode 8.3.1, Swift 3.1

  1. Tạo một mục mới trong info.plist "Xem giao diện thanh trạng thái dựa trên bộ điều khiển" đặt nó thành "KHÔNG".

  2. Mở AppDelegate.swift và thêm các dòng này vào phương thức "didFinishLaunchingWithOptions":

application.statusBarStyle = .lightContent


5

Dưới đây là Nguyên tắc / Hướng dẫn của Apple về thay đổi kiểu thanh trạng thái.

Nếu bạn muốn đặt kiểu thanh trạng thái, cấp ứng dụng thì hãy đặt UIViewControllerBasedStatusBarAppearancethành NOtrong .plisttệp của bạn . Và trong appdelegate> didFinishLaunchingWithOptionsthêm ine của bạn (theo lập trình, bạn có thể làm điều đó từ đại biểu ứng dụng).

Mục tiêu C

[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

Nhanh

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent
    return true
}

Nếu bạn muốn đặt kiểu thanh trạng thái, ở mức điều khiển xem, hãy làm theo các bước sau:

  1. Đặt UIViewControllerBasedStatusBarAppearancethành YEStrong .plisttệp, nếu bạn cần đặt kiểu thanh trạng thái ở cấp độ UIViewControll.
  2. Trong chức năng thêm viewDidLoad - setNeedsStatusBarAppearanceUpdate

  3. ghi đè ưa thíchStatusBarStyle trong trình điều khiển xem của bạn.

Mục tiêu C

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

Nhanh

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Đặt giá trị của .plist theo mức thiết lập kiểu thanh trạng thái.

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


5

Để thêm vào asnwer tuyệt vời bởi @Krunal https://stackoverflow.com/a/49552326/4697535

Trong trường hợp bạn đang sử dụng a UINavigationController, preferredStatusBarStylesẽ không có hiệu lực trên UIViewController.

Xcode 10 và Swift 4.

Đặt một tùy chỉnh UINavigationController

Thí dụ:

class LightNavigationController: UINavigationController {

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

Sử dụng tiện ích mở rộng cho giải pháp cấp ứng dụng:

extension UINavigationController {

  open override var preferredStatusBarStyle: UIStatusBarStyle {
      guard let index = tabBarController?.selectedIndex else { return .default }
      switch index {
      case 0, 1, 2: return .lightContent // set lightContent for tabs 0-2
      default: return .default // set dark for tab 3
      }
  }
}

4

Swift 4.0 Vui lòng sử dụng mã này trong "didFinishLaunchingWithOptions launchOptions:" Lớp Appdelegate

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

4

Swift 4+

cho văn bản thanh trạng thái màu trắng:

navigationController.navigationBar.barStyle = .blackTranslucent

4

iOS 11.2

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .black

    return true
}

'blackOpaque' không khả dụng: Sử dụng UIStatusBarStyleLightContent
Makalele

3

Điều này làm việc cho tôi

Đặt View controller-based status barngoại hình thành NO trong số nhiều, sau đó UIViewController viewDidAppearchỉ cần thêm dòng sau

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)

setStatusBarStyle không được dùng trong iOS 9.
Lastmboy

3

nhanh 3

if Xem thanh trạng thái dựa trên bộ điều khiển xuất hiện = CÓ trong Info.plist

sau đó sử dụng phần mở rộng này cho tất cả NavigationContoder

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

nếu không có UINavestionContaptor và chỉ có UIViewControll thì hãy sử dụng mã Dưới đây:

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

2
Không làm việc cho tôi. Tôi nhận được lỗi "Thuộc tính không ghi đè bất kỳ thuộc tính nào từ siêu lớp của nó" và "Getter cho 'preferStatusBarStyle' với bộ chọn Objective-C 'preferStatusBarStyle' xung đột với khai báo trước đó với cùng bộ chọn Objective-C".
Theo

Cảm ơn vì điều này, sau 20 lần thử khác nhau và một vài kết hợp các mục để thử, đây là cách để đặt màu thanh trạng thái. Tôi chỉ cần nhớ gọi setNeedStatusBarAppparentUpdate () khi tôi muốn thay đổi màu khi tôi thêm vào chế độ ban đêm và màu đen trên nền đen đơn giản là không hoạt động.
Stuart P.

3

Swift 5

Để thêm chi tiết cho câu trả lời của PRAVEEN tại https://stackoverflow.com/a/40066798/2082851 , tôi muốn cung cấp triển khai của mình. Nó hỗ trợ tính linh hoạt để tùy chỉnh thanh trạng thái của mỗi bộ điều khiển.

Nhìn chung, chúng tôi sẽ tạo ra một BaseViewControllerxử lý statusBarStyletài sản trong tất cả các trường hợp. Khi bạn tạo một bộ điều khiển mới, hãy đặt nó làm lớp con của bộ điều khiển cơ sở này.

Bất cứ khi nào bạn muốn thay đổi giao diện, bạn chỉ cần cập nhật thuộc tính này. Kiểu thanh trạng thái sẽ được cập nhật ngay lập tức.

Thực hiện

class BaseViewController: UIViewController {

    var statusBarStyle: UIStatusBarStyle = .default {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

Bản giới thiệu

class ViewController: BaseViewController, UIScrollViewDelegate {

    let scrollView = UIScrollView()
    ... 
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 30 {
                self.statusBarStyle = .darkContent
            } else {
                self.statusBarStyle = .lightContent
            }
        }
    }
}

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

2. UINavigationController

Đối với UINavigationController, đây là trường hợp đặc biệt, bạn có thể làm theo một trong hai giải pháp:

Giải pháp A: Ghi đè với công văn tin nhắn

Vì UINavestionControll là một NSObjectvà kế thừa từ đó ObjectiveC, các phương thức của nó là message dispatchvà bạn có thể ghi đè lên chúng.

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

Giải pháp B: Tạo UINavigationControllerlớp con

Nếu bạn đã có một tùy chỉnh UINavigationController(thường cần kiểm soát nhiều yêu cầu hơn), đây là giải pháp tốt nhất cho bạn.

final class NavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
    }
}

2

Bạn có thể sử dụng thuộc tính bool có tên "ShouldStatusBarDark" để chuyển đổi màu thanh trạng thái của bạn. Và bạn cũng có thể cập nhật giá trị của nó để thay đổi màu thanh trạng thái khi bạn cuộn.

 var shouldStatusBarDark = false {
     didSet {
         setNeedsStatusBarAppearanceUpdate()
     }
 }

 override var preferredStatusBarStyle: UIStatusBarStyle {
     return shouldStatusBarDark ? .default : .lightContent
 }

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
     let offSetY = scrollView.contentOffset.y
     if offSetY > 50 {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 1
             self.shouldStatusBarDark = true
         })
     } else {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 0
             self.shouldStatusBarDark = false
         })
     }
 }

tài sản navView là gì? cảm ơn vì đã chia sẻ giải pháp của bạn
medskill

1
@medskill NavView chỉ là một thanh điều hướng bắt chước được thêm vào theo chương trình.
tiantong

2

Hầu hết các câu trả lời này là cùng một điều được băm lại, nhưng không ai trong số chúng thực sự giải quyết màn hình khởi chạy cho tôi khi sử dụng nền tối.

Tôi đã khắc phục điều này bằng cách sau đây trong info.plistđó tạo ra một thanh trạng thái kiểu sáng.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

2

Nếu bạn đang nhận được cảnh báo: Setter cho 'statusBarStyle' không được dùng trong iOS 9.0: Sử dụng - [UIViewControll preferStatusBarStyle] , sau đó để đặt thanh trạng thái thành sáng hoặc tối, hãy sử dụng mã sau:

//To set the status bar to white
self.navigationController?.navigationBar.barStyle = .black //or .blackTranslucent

//To set the status bar to black
self.navigationController?.navigationBar.barStyle = .default

Điều này sẽ không làm cho navBar của bạn thay đổi hoàn toàn chỉ ra kiểu và do đó thay đổi thanh trạng thái tương ứng.

Lưu ý Bạn cần đảm bảo rằng bạn đã đặt trong thông tin của mình.

View controller-based status bar appearance to YES

2

Nếu bạn đang sử dụng bản trình bày phương thức, bạn cần đặt:

viewController.modalPresentationCapturesStatusBarAppearance = true

1

Trong iOS 13, bạn có thể sử dụng thuộc .darkContent UIStatusBarStyletính để hiển thị thanh trạng thái tối


0

Đối với mục tiêu C, chỉ cần thêm dòng này vào ứng dụng của bạn phương thức didFinishLaunch

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;

3
Điều này đã không được chấp nhận kể từ iOS 9
MK_Dev

0

sử dụng WebkitView

Swift 9.3 iOS 11.3

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!
    var hideStatusBar = true

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate()
        let myURL = URL(string: "https://www.apple.com/")
        let myRequest = URLRequest(url: myURL!)
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red

         webView.load(myRequest)

    }
}

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

3
Swift 9,3? Năm sai, Marty
Đơn vị iOS

Tôi khuyên bạn nên tránh sử dụng API riêng để lấy "statusBar". Apple luôn luôn thay đổi API! Và khi apple thay đổi API đó, ứng dụng của bạn có thể bị sập và nó sẽ không thay đổi thanh trạng thái nữa. Điều này sẽ khiến bạn phải tìm kiếm lại cho một giải pháp khác.
Doci

0

Nếu bạn vẫn không thể thay đổi kiểu thanh trạng thái dựa trên phương thức

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Bạn có thể thử sử dụng phương pháp này:

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}
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.