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.info
cờ 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 lightContent
vă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
để CÓ
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 UIViewController
trườ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:
- Khi khởi tạo màn hình, khi UI đang được chuẩn bị.
- 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ừ UIView
và do đó tự nhiên hỗ trợ backgroundColor
tà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 UINavigationBar
cá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 CÓ (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")
}
}
}