Son Güncelleme (Xcode 10+ / Swift 4.2+)
Bu makale, son birkaç yıldır var olan farklı yaklaşımların arkasındaki mantığı anlamak isteyen herkes için bozulmadan bırakılmıştır. Bu arada, Xcode 10'dan itibaren, Swift 4.2 ilk yaklaşımı kullanımdan kaldırılmıştır ve artık desteklenmemektedir (yani , kullanmaya çalıştığınızda etkili olmayacaktır). Plist.info
Bayrağın arkasındaki mantığı ve özelleştirme pratiğini daha iyi anlamak için bilgilerinizden hala bahsedilmektedir .
Önemli açıklama
Durum çubuğu görünümünü özelleştirmek için iki yaklaşımı anlamak çok önemlidir. Farklıdırlar ve karıştırılmamalıdırlar.
İlk yaklaşım - tüm uygulama için tek renk (iOS7'den beri DEPRECATED)
İnfo.plist adresinde,
View controller-based status bar appearance
ve bunu HAYIR olarak .
Bu ne yapar? Temel olarak, uygulamanızda durum çubuğu görünümünün her görünüm denetleyicisi tarafından ayrı ayrı tanımlanmadığını söyleyen bir ayar oluşturur . Bunu anlamak çok önemlidir. Bu, tüm ekranlar ve tüm ekranlar için aynı ayarın olduğu anlamına gelir . İki ayar vardır:default
beyaz arka plan üzerinde siyah metin veya lightContent
siyah arka plan üzerinde beyaz metin.
Bunlardan birini ayarlamak için (tüm ekranlar için bir ayar ):
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent // .default
return true
}
Bu şekilde, her görünümü denetleyicide bu ayarı yeniden kurmanız gerekmez. Ancak, görünümü gönüllü olarak değiştirmek için her zaman bu yönteme başvurabilirsiniz.
İkinci yaklaşım - her görünüm denetleyicisi için ayrı renk
Bu tam tersidir. Çalışması için info.plist adresine gidin ve
View controller-based status bar appearance
için EVET
Bu şekilde, her yeni görünüm denetleyicisi açık olduğunda, bu uygulamayı UIViewController
ihtiyacınız olan her örneğe eklerseniz durum çubuğu stili ayrı ayrı ayarlanır :
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // .default
}
İlk görünümdekiyle aynı, durum çubuğu için her görünüm denetleyicisine ayrı ayrı koyu veya açık bir stil ayarlayın.
Bu özellik iki senaryoda UIKit tarafından getirilir:
- Ekranın başlatılması üzerine, kullanıcı arayüzü hazırlanırken.
setNeedsStatusBarAppearanceUpdate()
Kod çağrıldıktan sonra .
İkinci durumda, durum çubuğu görünümünü aşağıdaki kodla değiştirmeye hak kazanırsınız:
var isDark = false {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return isDark ? .lightContent : .default
}
func toggleAppearance() {
isDark.toggle()
}
Sonra, her aradığınızda toggleAppearance()
, durum çubuğu stil değişikliği tetiklenir.
Üçüncü yaklaşım - Kes!
Durum çubuğuna doğrudan erişmenizi sağlayan bir kesmek var:
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
}
Neden hack? Siyah veya beyaz dışında durum çubuğu rengine ihtiyacınız varsa belgesiz API kullanırsınız. statusBar
KVC kullanarak nesne alırsınız ve arka plan rengini ayarlarsınız. Bu şekilde elde ettiğiniz nesne , mülkten UIStatusBar
türetilmiş UIView
ve dolayısıyla doğal olarak onu destekler backgroundColor
. Bu kirli, yasal bir yol değil, ancak şimdiye kadar durum UINavigationBar
çubuğu için özel renk ayarlamanın tek yolu ( navbar + durum çubuğu görünümünü tamamen özelleştirmeye izin veren yaklaşımı hesaba katmamak ). Uygulamanızı reddetmeye yönlendirebilir. Ama belki de şanslısın. Ve bazı karmaşık durumlarda (iç içe geçmiş hiyerarşi, çocuk gezinme ve görünüm denetleyicileri gibi) durum çubuğu görünümünü özelleştirmenin tek veya en azından daha az zahmetli yolu olabilir (örneğin, saydam yapmak)
Xcode 10+, Swift 4.2
Artık alternatif yok: geliştirici , bayrağı EVET olarak ayarlayarak (veya varsayılan olarak EVET olduğu için bu eylemi atlayarak) ve yukarıdaki talimatları izleyerek her görünüm denetleyicisinin durum çubuğu görünümünü tanımlamasına izin vermelidir .
Bonus
Durum çubuğu görünümünü herhangi bir aşamada gönüllü olarak değiştirmek için kullanabileceğiniz (teşvik edilmese de) Hack tabanlı çözüm. Renk açısından, aşağıdaki genişletme yöntemi düzenli bir yaklaşımla yapabileceklerinizi tam olarak yapar. Gereksinimlerinize göre ayarlayabilirsiniz.
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")
}
}
}