UIStatusBarStyle, Swift'de çalışmıyor


85

Swift uygulamamdaki Durum Çubuğu rengini beyaza çevirmeye çalışıyorum ama bir tuğla duvara çarpıyorum. Her biri bir NavigationController'a gömülü olan 3 ViewControllers'ım var (sorun bu olabilir mi? Kodu NavigationController sınıfına yerleştirmeyi zaten denedim.) Aşağıdaki kod parçalarının her ikisini de AppDelegate'imin didFinishLaunchingWithOptions'ında denedim .swift dosyası var ama ikisi de işe yaramadı.

application.statusBarStyle = .LightContent

ve

UIApplication.sharedApplication().statusBarStyle = .LightContent

Dokümanlar'ın bu konuda söylemesi gereken tek şey, UIBarButtonStyle'ın bir Int olduğu ve bana ima konusunda hiç yardımcı olmayan bu enum pasajını verdiğidir.

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

Neyi kaçırıyorum?

Yanıtlar:


145

İki seçeneğiniz var.

Durum çubuğunun stilini manuel olarak ayarlamaya devam etmek istiyorsanız, yaptığınız işe devam edin, ancak aşağıdaki anahtarı info.plist dosyanıza değeriyle eklemeniz gerekir NO.

Denetleyici tabanlı durum çubuğu görünümünü görüntüleyin

Veya uygulamanın statusBarStyle ayarını ayarlamak yerine, görünüm denetleyicisi tabanlı durum çubuğu görünümünü kullanmaya devam etmek istiyorsanız, preferredStatusBarStyle bir durum çubuğu stili belirtmek istediğiniz her görünüm denetleyicisindeki özelliği .

Hızlı 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

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

Bu kodu denedim ... ancak ilk ekranda yalnızca beyaz durum çubuğunu görüyorum .. Ekranların geri kalanı için durum çubuğunu alamıyorum :( .. herhangi bir yardım?
Rahul

7
Plistinizdeki "Denetleyici tabanlı durum çubuğu görünümünü görüntüle" ayarını EVET olarak ayarlamanız gerekir.
StackUnderflow

1
Bu, yalnızca bir görünüm denetleyicisi tabanlı durum çubuğu görünümü kullanmak istiyorsanız .
Sam Holmes

4
iOS 10'da (Swift 3.0) artık yöntem değil, özelliktir. Bakınız: stackoverflow.com/questions/38862208/…
stevo.mit

sadece bir ekran için
Oubaida AlQuraan

143

Swift 3.0

AppDelegate.swift'te didFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

Swift 2.2

AppDelegate.swift'te didFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO

1
Bu mükemmel cevap :)
Jay Mayu

1
Mükemmel cevap. Kısa ve güzel.
Mehul

3
üzgünüm, bu en basit cevap olabilir, ancak kesinlikle EN İYİ değildir: çünkü bu tek stili uygulamadaki tüm viewControllers için ayarlar. Davranış, daha hassas kontrol sağlamak ve farklı görünüm kontrolörlerine (örneğin açık ve koyu içerikleri karıştırmak) dayalı farklı ayarları uygulamak için tanıtıldı.
auco

Bu tuhaf - Apple dokümanlarının söylediği gibi değil, ama işe yarıyor. UIViewController tabanlı bir durum çubuğuna sahip olmak da dahil olmak üzere bir dizi başka yol denedim, hiçbiri işe yaramadı.
n13

33

Şunları ayarlamalısınız:

navigationController.navigationBar.barStyle = .black

ve metin beyaz görünecek


1
Teşekkürler! Hiçbir şey preferredStatusBarStyle () fonk bile bu geçersiz kılmayı yardımcı oldu -> bu gerçekten yardımcı UIStatusBarStyle {return UIStatusBarStyle.LightContent}: navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = true
Svitlana

Teşekkür! Günümü kurtardın. Ancak, BlackTranslucent kullanımdan kaldırılmıştır. Bu nedenle, navigationController.navigationBar.barStyle = .Black
hsusmita

Mükemmel çalışıyor override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }. Sadece bu satırı viewDidLoadiyi yazmanız gerekiyor . View controller-based status bar appearance = YESBu çözüme devam ettiğinizden emin olun .
Bhavin_m

aşırılık gibi görünüyor ... biraz önce denedim ve Info.plist dosyasında şu şekilde çalıştı: 1. Durum çubuğu stili -> UIStatusBarStyleLightContent 2. Denetleyici tabanlı durum çubuğu görünümünü görüntüleyin -> HAYIR
raistlin

Bu değişikliği yapmak geri düğmemin kaybolmasına neden oldu.
Leon

21

İOS9.x ve Xcode7 için bunu içine koymanız yeterlidir AppDelegate.swift:

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

    UINavigationBar.appearance().barStyle = .Black

} 

Bu, .Lightcontentbir UINavigationController içindeki tüm görünüm denetleyicileri için durum çubuğunuzun stilini otomatik olarak çevirir.

(Ayrıca View controller-based status bar appearancemuhtemelen gördüğünüz uyarıları bastırmak için Info.plist'ten silin !)


teşekkür ederim. İOS9'da ciddi bir hata var gibi görünüyor. Durum çubuğunu ilk VC beyazına çevirebilmemin tek yolu buydu. Her şeyi denedim. Bir radar göndereceğim.
1b0t

PreferStatusBarStyle, UIStatusBarStyleDefault'u döndürüyor, ancak belirli görüntü denetleyicisi için lightcontent'i darkcontent'e güncellemiyor. Self.navigationController.navigationBar.barStyle = UIBarStyleDefault sonra; in viewWillAppear benim için çalıştı. Umarım bu yorum başkalarına yardımcı olur.
Pandey_Laxman

UIStatusBarStyle'ın Swift 3'te ".black" (küçük B harfi) olarak değiştirildiğine dikkat edin
brycejl

16

Swift 3'te, durum çubuğu stili UIViewController'da şu şekilde geçersiz kılabileceğiniz bir hesaplanan özelliğe değiştirildi:

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

13

İOS 9'da aşağıdakiler (setStatusBarStyle) kullanımdan kaldırılmıştır ve bu şekilde giderseniz bir uyarı alırsınız.

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

Tüm statusBar'ların tek seferde değiştirilmesini istiyorsanız, aşağıdakileri Info.plist'inize eklemeyi deneyin. Bu aynı zamanda başlatma ekranı durum çubuğunuzu beyaz hale getirecektir. Yukarıdaki kod olmazken.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

.Plist yaklaşımı doğrudur, ancak setStatusBarStyle () gerekli değildir. 'setStatusBarStyle (_: animated :)', iOS 9.0'da kullanımdan kaldırıldı: Kullanım - [UIViewController preferStatusBarStyle]
Bill Chan,

@BillChan yorum yaptığınız için teşekkürler ama lütfen cevap kazancını okuyun. 'SetStatusBarStyle'ın kullanımdan kaldırıldığını zaten açıkladım. Bir veya daha fazla viewControllers'ın değiştirilmesini istiyorsanız PreferStatusBarStyle'ı kullanmalısınız. Plist yaklaşımı, tüm viewControllers'ın tek seferde değiştirilmesini isteyenler içindir. Burada doğru ya da yanlış yok. Sadece başarmanız gereken şey.
GuiSoySauce

1
UIStatusBarStyle = UIStatusBarStyleLightContent (.plist içinde) uygulamamın beyaz durum çubuğu metni ile başlamasına yardımcı oldu ... Teşekkürler !!!
Chris Allinson

10

benim için her şeyden önce şunu ekleyene kadar işe yaramaz:

self.navigationController?.navigationBar.barStyle = .black;

yani:

  1. Set UIViewControllerBasedStatusBarAppearanceiçin YESde.plist
  2. Gelen viewDidLoadçağrıself.setNeedsStatusBarAppearanceUpdate();
  3. PreferredStatusBarStyle'ı geçersiz kıl
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. Overrided yöntemde ben de set navigationBar.barStyleöylesine nihai
    için ışık : içerik
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    ve için siyah içerik kullanımı varsayılan

Buradan ve buradan kaynak .

ve bu işe yaramazsa şunu eklemeyi deneyebilirsiniz UINavigationController extension:

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

        return .default
    }
}

1
Gezinme çubuğu stili hakkında yorum yok ... ama Swift 3, Xcode 8'de - bu benim için çalışan tek çözümdü.
Despotovic

Fark ettiğim tek dezavantaj, tüm bu adımlarla ancak animasyon olmadan değişmesidir
Lukasz 'Severiaan' Grela

6

Garip, Swift 3.1 ve XC8.2.1 kullanmak, ancak yukarıdakilerin hiçbiri işe yaramadı.

Yaptığım şey sadece

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

Plist yok, başka bir şey yok. HTH


Swift 4.2 için de çalışıyor.
zeeshan

2

Swift 3.0'da ViewController'da bir alıcıyı, View denetleyicisi tabanlı durum çubuğu görünümü için geçersiz kılabilirsiniz:

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

1

Info.plistinizi düzenlemeyin. Bunu ViewController.swift'inize ekleyin:

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

1

1. Adım info.plist'e ekleyin View controller-based status bar appearance -> NO

Adım 2. Durum çubuğu rengini değiştirmeniz gereken yöntemde kodu ekleyin:

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

Anahtar kod satırı: setNeedsStatusBarAppearanceUpdate()

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.