Swift 3'te Durum Çubuğu Stili nasıl ayarlanır


186

Xcode 8.0 beta 4 kullanıyorum.

Önceki sürümde, UIViewController durum çubuğu stilini ayarlama yöntemine sahipti

public func preferredStatusBarStyle() -> UIStatusBarStyle

Ancak, Swift 3'te bir "SADECE değişebilir olsun" olarak değiştirildi buldum.

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

UIViewController'ımda kullanılacak stili nasıl sağlayabilirim?


UIStatusBarStyle = .lightContent: Bu var preferredStatusBarStyle deneyin
Anbu.Karthik

Yanıtlar:


486

[GÜNCELLENDİ] Xcode 10+ ve Swift 4.2+ için

Bu, iOS 7 ve üstü için tercih edilen yöntemdir

Başvurunuz yıllarda Info.plist, set View controller-based status bar appearanceiçin YES.

Görünüm denetleyicilerinizin her birinde geçersiz kıl preferredStatusBarStyle ( Apple belgeleri ). Örneğin:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

Eğer varsa preferredStatusBarStyle(kaydırma konumuna olsun veya görüntülenen görüntü karanlık olsun, örneğin) görünümü denetleyicisi içeride değiştiren şey dayanan farklı tercih durum çubuğu stilini dönen, ardından aramak istediğiniz olacak setNeedsStatusBarAppearanceUpdate()zaman devlet değişiklikleri.

Sürüm 7'den önceki iOS, kullanımdan kaldırılmış yöntem

Apple bunu reddetti , bu nedenle gelecekte kaldırılacak. Bir sonraki iOS sürümü yayınlandığında yeniden yazmak zorunda kalmamak için yukarıdaki yöntemi kullanın.

Uygulamanız, uygulamaya yıllarda destekleyecek olursa Info.plist, set View controller-based status bar appearanceiçin NO.

Olarak appDelegate.swift, didFinishLaunchingWithOptionsişlevi, ekleyin:

UIApplication.shared.statusBarStyle = .lightContent

Gezinti Denetleyici için

Bir gezinme denetleyici kullanmak ve her görünüm denetleyicisi tercih durum çubuğu tarzı kullanılmış ve ayarlanacak istiyorsanız View controller-based status bar appearanceiçin YESbaşvurunuz yıllardainfo.plist

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

4
Benim için çalışıyor. Önce yeni ayarı Info.plist'e eklemeyi unuttum.
falsecrypt

1
BarStyle kullanımdan kaldırılmadı, bunu iOS 11'de kullandım ve çalışıyor.
Sushobhit

1
@Sushobhit setStatusBarStyle, bu yanıtta kullanıldığı gibi iOS 9'da kullanımdan kaldırıldı. Ancak yine de salt okunur bir özellik olarak UIApplication.statusBarStyle'a sahipsiniz.
LightMan

1
Her görünümün rengi nedeniyle programlı olarak ayarlamak istediğiniz zamanlar vardır.
Alejandro Cavazos

9
Ayrıca, appDelegate.swift öğesindeki satırı kaldırabilir ve Hedef -> Genel -> Dağıtım Bilgileri -> Durum Çubuğu Stili -> Hafif
Robert Veringa

162

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.infoBayrağı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 lightContentsiyah 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ı UIViewControllerihtiyacı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:

  1. Ekranın başlatılması üzerine, kullanıcı arayüzü hazırlanırken.
  2. 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. statusBarKVC kullanarak nesne alırsınız ve arka plan rengini ayarlarsınız. Bu şekilde elde ettiğiniz nesne , mülkten UIStatusBartüretilmiş UIViewve 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")
        }
    }
}

2
Durum çubuğuna sahip olduğunuzda, bunu da yapabilirsiniz: statusBar.setValue (UIColor.red, forKey: "foregroundColor"); ya da mevcut herhangi bir anahtarı kullanarak UIStatusBar için kullanılabilen ancak UIView için mevcut olmayan herhangi bir özelliği ayarlayın
Mark

application.statusBarStyle = .lightContent bu yaklaşım genellikle iOS9'da 'statusBarStyle' için ayarlayıcı iOS 9.0'da kullanımdan kaldırıldığından beri kullanılır: Kullanım - [UIViewController
preferStatusBarStyle

Uygulamanın renk temasını değiştirirken burada çalışan tek şey budur. Ancak, bu ayarlandıktan sonra, görünüm denetleyicilerini değiştirirken her zaman sıfırlamanız gerekir. Tercih edilenStatusBarStyle () yöntemi buradan yok sayılır (info.plist'deki uygun ayarla bile).
nontomatic

2
Bu cevap diğerlerine göre daha açıklayıcıdır.
ViruMax

2
Bonus çözümü iOS
13.1'de

130

Ayarlamak yerine döndürülen değeri geçersiz kılmayı deneyebilirsiniz. Yöntem {get} olarak bildirildiğinden, yalnızca bir alıcı sağlayın:

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Bunu koşullu olarak ayarlarsanız, setNeedsStatusBarAppearanceUpdate()hazır olduğunuzda değişikliği canlandırmak için aramanız gerekir.


2
prefersStatusBarHiddenBazı görüşleriniz için seçebileceğinizden bu daha iyi bir yaklaşımdır . Eğer gidiyorsanız onunla UIApplication.shared.statusBarStylesıkışmış olacaksınız.
superarts.org

105

Swift 3 ve 4, iOS 10 ve 11, Xcode 9 ve 10
Benim için bu yöntem işe yaramıyor:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Ben her görünüm denetleyicisi için kullanılan, ama bu çalıştı:

  • İnfo.list dosyasına satır: ekleyin View controller-based status bar appearanceveNO

  • Appdelegate'de bir sonraki:

    UIApplication.shared.statusBarStyle = .lightContent

Yalnızca uygulama temsilcisine kod ekledikten sonra çalışıyordum, ancak bilgi plist ayarı benim için yararlı oldu. teşekkür ederim
Akhilesh Sharma

6
İOS 9.0'da 'statusBarStyle' için ayarlayıcı kullanımdan kaldırıldı: Kullan - [UIViewController preferStatusBarStyle]
preferStatusBarStyle

33

statusBar'Nin rengini beyaz olarak değiştirmek istiyorsanız, a'daki tüm görünümler UINavigationControlleriçin bunu içine ekleyin AppDelegate:

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

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

Bu kod:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

gelmez için çalışmak UIViewControllersbir içerdiği UINavigationControlleriçin derleyici görünüyor, çünkü statusBarStylebir UINavigationControllerdeğil, statusBarStylebir ViewControllersonun tarafından içeriyordu.

Umarım bu kabul edilen cevapta başarılı olamayanlara yardımcı olur!


Evet çok teşekkür ederim! Navigasyon denetleyicisi, pek çoğunun dikkate almadığı küçük bir nüanstı!
Alexis Candelaria

26

Durum çubuğu stilini görünüm görüntülendikten sonra istediğiniz zaman değiştirmek isterseniz bunu kullanabilirsiniz:

  • İnfo.list dosyasında satır ekle: Denetleyici tabanlı durum çubuğu görünümünü görüntüleyin ve EVET olarak ayarlayın

    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
AndIf you call this method within an animation block, the changes are animated along with the rest of the animation block.
Alexandre G

26

Xcode 10 veya üstü

Swift 5'de test edildi

Kod gerekmez sadece aşağıdaki adımları izleyin.

Tüm uygulamada durum çubuğunu değiştirmek istiyorsanız.

  1. Proje Gezgini'nden (sol panel) Proje'yi seçin.
  2. Hedef seç.
  3. Genel sekmesini seçin.
  4. Dağıtım bilgilerini bulun.
  5. Durum çubuğu stilini Açık olarak değiştirin (koyu arka plan "Açık" , Açık arka plan "Varsayılan" için )

Bilgi unutma. Liste değişiklikleri

  1. Bilgi sekmesini seçin
  2. Bu anahtarı plist dosyanıza ekleyin "Denetleyici tabanlı durum çubuğu görünümünü görüntüle" = HAYIR

Projenizi çalıştırın ve kontrol edin.

Hızlı 5 ve Xcode 10.2 ve 11.0'daki projem


Xcode 10 / Swift5 için bu kabul edilen cevap olmalıdır. Bunun çalışması için İKİ adım atmanız gerekir.
John Robi

Mükemmel. Teşekkür ederim! Bunun kabul edilen gerçek cevap olması gerektiğine katılıyorum.
17'de

Bu mükemmel bir cevap 🤟🏻
nikhilgohil11

Bu tamamen hızlı 5 ile xcode 11 için de çalışıyor, teşekkürler
Luis Santiago

25

Info.plist dosyanıza aşağıdaki anahtarı eklemeniz gerekir:

View controller-based status bar appearance boole değeri NO

Appdelegate sınıfınızda, dönüşten didFinishLaunchingWithOptionsönce yöntemde.

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

değişim backgroundColorve statusBarStyleşartının olarak.


Güzel bir çözüm, ancak bu özel bir API kullanmak olarak sayılıyor mu?
GoldenJoe

İyi çalışıyor, ancak özel rengimi nasıl değiştirebilirim?
iSrinivasan27

@MohanSrinivasan yerine "UIColor.red" size özel renk belirtebilirsiniz.
Himanshu padia

13

Bunu film şeridinde de yapabilirsiniz

  1. İnfo.plist "Denetleyici tabanlı durum çubuğu görünümünü görüntüle" altında yeni bir giriş oluşturun "EVET" olarak ayarlayın.
  2. Film şeridinize gidin ve değiştirmek istediğiniz gezinme denetleyicisini seçin. Film şeridi belge anahattı bölümündeki gezinme çubuğunu tıklayın (film şeridinde sol panel)
  3. Sağ panele gidin ve özellikler bölümünü tıklayın
  4. Gezinti Çubuğu bölümünün altında stil göreceksiniz. İstediğiniz stili seçin (varsayılan siyah içindir ve siyah beyaz içindir)

Bunu, sahip olduğunuz her bir navigasyon denetleyicisi için yapmanız gerekecektir. Ancak, bu gezinti denetleyicisinin altındaki tüm görünümler, görünümün tüm durum çubukları stilini / rengini yeni seçtiğiniz görünümle değiştirir. Sonuçlarınızı anında görebildiğiniz ve her görünüm denetleyicisine fazladan kod satırı eklemeniz gerekmediği için bu seçeneği daha iyi buluyorum.

resim açıklamasını buraya girin

(Tüm Swift projelerinde Xcode 8.3.3 ile yapıldı)


"Denetleyici tabanlı durum çubuğu görünümünü görüntüle", "HAYIR" olarak ayarlanmalıdır
Willjay

2
Durum çubuğu stilini Görünüm Denetleyicisi içeriğine göre ayarlamanın çok temiz bir yolu; bu, View controller-based status bar appearance = NOtüm uygulamada yalnızca açık veya koyu stili kullanmak yerine doğru yoludur . Bu "Kodsuz" yolun yalnızca Gezinti Denetleyici'de çalışması utanç vericidir, Apple bu seçeneği herhangi bir Görünüm Denetleyicisi örneğinde ayarlamak için başka bir alan eklemeyi düşünmelidir.
aldoram5

12

Tüm görünüm denetleyicileri için durum çubuğunu değiştirmek isteyen kullanıcılar için: iOS 11, Swfit 4/5 çözümü oldukça kolaydır.

1) Bilgi listesi eklemek:

Denetleyici tabanlı durum çubuğu görünümünü görüntüleme -> HAYIR

2) XCode slect projesinin sol tarafı> Hedefler > Projenizi seçin> Genel altında> Dağıtım Bilgileri> Durum Çubuğu Stilini Seç: Işık

Durum çubuğunu yalnızca bir viewcontroller için değiştirmek istiyorsanız , viewDidLoad'da şunu ekleyin:

2.1 ) Bilgi listesi

Denetleyici tabanlı durum çubuğu görünümünü görüntüleme -> EVET

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Uygulama Temsilcisinden Amaç-C (veya yerel tepki) değişikliği:

1) Bilgi listesi eklemek:

Denetleyici tabanlı durum çubuğu görünümünü görüntüleme -> HAYIR

2) AppDelegate -> didFinishLaunchingWithOptions

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

Durum çubuğunu değiştirmek , yalnızca modally viewtroltor'ları sunarken push (navigasyon kontrolörleri) yapmaya çalışmaz .


8

İlk adım , dosyaya anahtar: View controller-based status bar appearanceve değer içeren bir satır eklemeniz gerekir . Bundan sonra, yalnızca o denetleyicinin etkileyeceği özelliğe denetleyicinize 2 işlev ekleyin:NOInfo.plist

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

Hızlı 3

Info.plist dosyasına "Denetleyici tabanlı durum çubuğu görünümünü görüntüle" adlı bir satır ekleyin ve değerini olarak ayarlayın No.

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

    }

}

6

Gezinme çubuklarıyla uğraşırken durum çubuğu metin rengiyle ilgili küçük bir sorun var gibi görünüyor.

.Plist girişinin Denetleyici tabanlı durum çubuğu görünümünü görüntüle olarak ayarlanmasını istiyorsanız YES istiyorsanız, bazen renkli bir gezinme çubuğunuz olduğunda çalışmaz.

Örneğin:

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

ve

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

AppDelegate'te aşağıdakileri ayarlamış olsanız bile yukarıdaki kod çalışmaz:

UIApplication.shared.statusBarStyle = .lightContent

Hala mücadele edenler için, durum çubuğunun gezinme çubuğundaki stiller tarafından aydınlık veya karanlık olması gerektiği bir şekilde yargılıyor. Bu nedenle, viewWillAppear'da aşağıdaki satırı ekleyerek bunu düzeltmeyi başardım:

nav?.barStyle = UIBarStyle.black

Çubuk stili siyah olduğunda, geçersiz kılınan değişkeninizi dinler. Umarım bu birine yardımcı olur :)


6

@Krunal tarafından büyük asnwer'a eklemek için https://stackoverflow.com/a/49552326/4697535

A kullanıyorsanız UINavigationController, preferredStatusBarStylebunun üzerinde hiçbir etkisi olmayacaktır UIViewController.

Xcode 10 ve Swift 4.

Özel ayarlar UINavigationController

Misal:

class LightNavigationController: UINavigationController {

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

Uygulama düzeyinde bir çözüm için uzantı kullanın:

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
      }
  }
}

5

Xcode 8.3.1, Swift 3.1

  1. İnfo.plist "Denetleyici tabanlı durum çubuğu görünümünü görüntüle" altında yeni bir giriş oluşturun "NO" olarak ayarlayın.

  2. AppDelegate.swift dosyasını açın ve "didFinishLaunchingWithOptions" yönteminde şu satırları ekleyin:

application.statusBarStyle = .lightContent


5

Swift 4+

beyaz durum çubuğu metni için:

navigationController.navigationBar.barStyle = .blackTranslucent

5

İşte Apple Kuralları / Talimatı durum çubuğu tarzı değişikliği ile ilgili.

Eğer durum çubuğu stilini ayarlamak istiyorsanız, uygulama düzeyinde daha sonra ayarlamak UIViewControllerBasedStatusBarAppearanceiçin NOsizin de .plistdosyaya. Ve appdelegate> didFinishLaunchingWithOptionsine ekleyin (programlı olarak bunu uygulama temsilcisinden yapabilirsiniz).

Hedef C

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

hızlı

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

durum çubuğu stilini ayarlamak istiyorsanız, görünüm denetleyicisi düzeyinde şu adımları izleyin:

  1. Set UIViewControllerBasedStatusBarAppearanceiçin YESde .plistsize UIViewController düzeyinde sadece set durum çubuğu tarzı gerekiyorsa, dosyaya.
  2. ViewDidLoad ekleme işlevinde - setNeedsStatusBarAppearanceUpdate

  3. görünüm denetleyicinizde tercih edilen durumBarStyle'ı geçersiz kıl.

Hedef C

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

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

hızlı

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

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Durum çubuğu stili kurulum düzeyine göre .plist değerini ayarlayın.

resim açıklamasını buraya girin


4

Swift 4.0 Lütfen bu kodu "didFinishLaunchingWithOptions launchOptions:" içindeki Appdelegate sınıfı

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

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' kullanılamıyor: UIStatusBarStyleLightContent kullanın
Makalele

3

Bu benim için çalıştı

View controller-based status barGörünümü plist içinde NO olarak ayarlayın , sonra In UIViewController viewDidAppearsadece aşağıdaki satırı ekledi

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

setStatusBarStyle iOS 9'da kullanımdan kaldırıldı
Lastmboy

3

hızlı 3

Info.plist'te denetleyici tabanlı durum çubuğu görünümünü görüntüle = EVET ise

bu uzantıyı tüm NavigationController için kullanın

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

UINavigationController yoksa ve yalnızca UIViewController varsa aşağıdaki kodu kullanın:

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

2
Benim için çalışmıyor. "Mülkiyet üst sınıfından herhangi bir özelliği geçersiz kılmaz" ve "Objective-C seçicisiyle 'preferStatusBarStyle' için Getter 'aynı Objective-C seçicisiyle önceki bildirimle çakışıyor" hatalarını alıyorum.
Theo

Bunun için teşekkürler, 20 farklı denemeden ve birkaç öğe kombinasyonundan sonra bunu denemek için durum çubuğu rengini ayarlamanın yolu budur. Ben sadece bir gece modunda eklerken ve siyah üzerine siyah sadece çalışma değildi olarak rengini değiştirmek istediğimde setNeedsStatusBarAppearanceUpdate () çağırmak hatırlamak zorunda kaldı.
Stuart P.

3

Hızlı 5

PRAVEEN'in https://stackoverflow.com/a/40066798/2082851 adresindeki yanıtı için daha fazla ayrıntı eklemek için , uygulamanızı sağlamak istiyorum. Her denetleyicinin durum çubuğunu özelleştirme esnekliğini destekler .

Genel olarak, her durumda özelliği BaseViewControllerişleyen bir yaratacağız statusBarStyle. Yeni bir denetleyici oluşturduğunuzda, bu temel denetleyicinin alt sınıfı yapın.

Durum görünümünü değiştirmek istediğinizde, yalnızca bu özelliği güncellemeniz gerekir. Durum çubuğu stili hemen güncellenecektir.

uygulama

class BaseViewController: UIViewController {

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

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

gösteri

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
            }
        }
    }
}

resim açıklamasını buraya girin

2. UINavigationController

Çünkü UINavigationController, her iki çözümü de takip edebileceğiniz özel bir durumdur:

Çözüm A: İleti gönderimi ile geçersiz kılma

UINavigationController bir NSObjectve devralma ObjectiveColduğundan, yöntemleri vardır message dispatchve bunları geçersiz kılabilirsiniz.

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

Çözüm B: Alt UINavigationControllersınıf oluştur

Zaten bir özeliniz varsa UINavigationController(genellikle daha fazla gereksinimi kontrol etmeniz gerekir), bu sizin için en iyi çözümdür.

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

2

Durum çubuğu rengini değiştirmek için "shouldStatusBarDark" adlı bir bool özelliği kullanabilirsiniz. Ayrıca, kaydırma yaparken durum çubuğu rengini değiştirmek için değerini güncelleyebilirsiniz.

 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
         })
     }
 }

navView özelliği nedir? çözümünüzü paylaştığınız için teşekkür ederiz
medskill

1
@medskill navView, yalnızca programlı olarak eklenen mimik bir gezinti çubuğudur.
tiantong

2

Bu yanıtların çoğu yeniden hash edilenle aynıdır, ancak hiçbiri karanlık bir arka plan kullanırken aslında benim için başlatma ekranını ele almaz.

Ben info.plisthafif bir tarz durum çubuğu üreten benim ile aşağıdaki var .

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

2

Uyarıyı alıyorsanız: 'statusBarStyle' ayarlayıcısı iOS 9.0'da kullanımdan kaldırıldı: - [UIViewController preferStatusBarStyle] öğesini kullanın , ardından durum çubuğunu açık veya koyu olarak ayarlamak için aşağıdaki kodu kullanın:

//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

Bu, navBar'ınızı değiştirmez, yalnızca stili gösterir ve bu nedenle durum çubuğunu buna göre değiştirir.

NB. İnfo.plist adresinde ayarladığınızdan emin olmanız gerekir.

View controller-based status bar appearance to YES

2

Kalıcı sunum kullanıyorsanız, ayarlamanız gerekir:

viewController.modalPresentationCapturesStatusBarAppearance = true

1

İOS 13'te .darkContent UIStatusBarStylekaranlık durum çubuğunu görüntülemek için özelliği kullanabilirsiniz


1

Durum çubuğu stili temelini yönteme göre değiştiremiyorsanız

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Bu yöntemi kullanmayı deneyebilirsiniz:

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}

0

Amaç C için sadece bu satırı uygulamanıza ekleyin didFinishLaunch yöntemi

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;

3
Bu, iOS 9'dan bu yana kullanımdan kaldırıldı
MK_Dev

0

WebkitView'ı kullanma

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? Yanlış yıl Marty
iOS Unit

Ben exaple "statusBar" için özel API kullanarak uzak kalmak öneririz. Apple her zaman API'da değişiklik yapıyor! Apple bu API'yı değiştirdiğinde uygulamanız çökebilir ve durum çubuğunu artık değiştirmez. Bu, tekrar başka bir çözüm aramanızı sağlayacaktır.
Doci
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.