Swift iOS uygulamasında durum çubuğunu nasıl gizlerim?


202

Ekranın üst kısmındaki durum çubuğunu kaldırmak istiyorum.

Bu çalışmıyor:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
        application.statusBarHidden = true
        return true
}

Ayrıca denedim:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    var controller = UIViewController()
    application.statusBarHidden = true
    controller.setNeedsStatusBarAppearanceUpdate()

    var view = UIView(frame: CGRectMake(0, 0, 320, 568))
    view.backgroundColor = UIColor.redColor()
    controller.view = view

    var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
    label.center = CGPointMake(160, 284)
    label.textAlignment = NSTextAlignment.Center
    label.text = "Hello World"
    controller.view.addSubview(label)

    self.window!.rootViewController = controller
    self.window!.makeKeyAndVisible()
    return true
}

Yanıtlar:


451

Görünüm denetleyicilerinize gerçekten prefersStatusBarHidden uygulamalısınız:

Swift 3 ve üstü

override var prefersStatusBarHidden: Bool {
    return true
}

4
Bence Jay'in amacı tam bir uygulama için durum çubuğunu gizlemektir. Bu yüzden uygulamanın didFinishLaunchingWithOptions içindeki gizleme işlevselliğini yazmış olurdu. Tam uygulama için durum çubuğunu gizleme
Satyam

@Satyam iyi bir noktaya sahip, bunu tüm uygulama boyunca kaldırmak güzel olurdu. Bunu miras yoluyla uygulamaya yönelik bir yaklaşım var mı? Veya protokol uzantısı ile mi?
Dan Beaulieu

3
@DanBeaulieu Kalıtım yoluyla harika bir çözüm olacağını düşünüyorum. Gizli çubuğun true olarak ayarlandığı bir UIViewController alt sınıfı oluşturun ve ardından tüm alt sınıflarınızı bu sınıftan devralın. Başka bir yaklaşım Swizzling
kriz

1
Swift 3 kodu çalışmadı, bkz .: stackoverflow.com/a/38902285/129202
Jonny

1
Bu yöntemde bir hata var: bir segue gerçekleştirmek istediğinizde, mevcut görünüm
denetleyicisinin

99
  1. Info.plist dosyasına git
  2. Fareyle bu satırlardan birinin üzerine geldiğinizde bir (+) ve (-) düğmesi görünecektir.
  3. Büyük harf V ile başlayan yeni anahtar türü eklemek için artı düğmesini tıklatın; otomatik olarak ilk seçenek Denetleyici tabanlı durum çubuğu görünümünü göster olacaktır.
  4. Bunu ANAHTAR olarak ekleyin.
  5. VALUE değerini "NO" olarak ayarlayın
  6. Sana git AppDelegate.swift
  7. Yöntemin içine kodu ekleyin

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
        application.statusBarHidden = true
        return true
    }

YAPILAN! Uygulamanızı çalıştırın ve artık durum çubuğu yok!


1
İlk başta bu çözümün iyi çalıştığını düşündüm, ancak daha sonra CG_CONTEXT_SHOW_BACKTRACE ile hata ayıklamak için gereken bir hataya neden olduğunu fark ettim. "Denetleyici tabanlı durum çubuğu görünümünü görüntüle" eklemesine geri çekildi
Sean

IOS 9 2.2'de benim için iyi çalıştı
uplearnedu.com

1
İOS 10.1 simülatörü için çalıştı. Teşekkürler @nycdanie.
Jerome

7
"Denetleyici tabanlı durum çubuğu görünümünü görüntüle" seçeneğini HAYIR olarak ayarlamaya ek olarak, "Durum çubuğu başlangıçta gizlidir" i "EVET" olarak ayarlanmış olarak ekleyin. Ardından görünüm denetleyicisine kod eklemenize gerek yoktur; durum çubuğu tüm uygulamada gizlenir. Xcode 8.1, Swift 3.0.1, iOS 10
tylerSF

1
@tylerSF Harika çalışıyor! Bunu bir cevap olarak eklemelisiniz :)
Pétur Ingi Egilsson

72

Hızlı 3

In Info.plistsetine View controller-based status bar appearanceiçinNO

Ve Çağrı yap UIApplication.shared.isStatusBarHidden = true


1
Evet olarak ayarlanmışsa, çalışmanın tek yolu budur.
farzadshbfn

@ farzadshbfn doğru değil. Bahsettiğim ve benim tarafımdan test edildiği gibi boolean NO ile çalışır.
Codetard

43

Kaydırma menüsünü , açılır pencereleri vb . Sunarken ve kapatırken, düğme musluğundaki durum çubuğunu gizlemek ve geri getirmek istiyorsanız, bu yöntemi kullanabilirsiniz:

Durum çubuğunu gizlemek için: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

Durum çubuğunu geri getirmek için: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 

Bu daha çok bir hack. Pencereyi bu şekilde karıştırmak istemem ... özellikle bir çözüm zaten varsa. Geliştiricileri, prefersStatusBarHiddenözelliği daha önce bahsedilenler gibi geçersiz kılmaya teşvik ediyorum .
Stephen Paul

2
Bu durum çubuğunu anlık olarak gizlemek ve geri getirmek istiyorsak kullanılabilir. Uygulamamda, kaydırıcı menüsü sol taraftan geldiğinde, durum çubuğunu gizlemek zorundayım. ve menü kaybolduğunda, gmail'in iOS uygulamasında olduğu gibi durum çubuğunu geri getirmeliyiz .. böylece bu tür senaryolarda bunu kullanabiliriz.
Vincent Joy

3
Bir kesmek IS, ve onunla karışmam ama does an için çalışmalarını. Hepinizin söylediği gibi. Sorun prefersStatusBarHidden, durum çubuğunu kısıtlamaları kullanarak ve ayrıca gezinme çubuklarını kullanarak bağladığınız görünümlerin durum çubuğunu kullanarak açar / kapatırsanız kötü bir şekilde hareket etmesidir prefersStatusBarHidden . Şimdilik sadece bu cevap bu işe yarıyor gibi görünüyor.
Jonny

Tamamen @Jonny ile hemfikirim, ben de bu çözümü sevmiyorum ama söylediği gibi, geçersiz kılma sınırınızı bozacaktır prefersStatusBarHidden. Şimdiye kadar bu işi yapıyor. Ancak singletons kullanmaktan kaçınmak için küçük bir sarıcı kullanıyorum, burada
rgkobashi

34

kodlamak yerine görsel bir yaklaşımı tercih ediyorsanız şu yöntemi kullanın: info.plist

resim açıklamasını buraya girin basitçe eklemek View controller-based status bar appearanceiçinNO

ve Status bar is initially hiddengibiYES


2018'de kanonik cevap bu
ChrisH

28
 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true);
    navigationController?.navigationBar.hidden = true // for navigation bar hide
    UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}

28

İOS 10 / Swift 3.0 Güncellemesi

Artık bir işlev değil, şimdi bir özellik ...

override var prefersStatusBarHidden: Bool {
    return true
}

Bunu tüm uygulama boyunca nasıl ayarlayacağınızı biliyor musunuz, şu anda bunu her görünüme girmek zorundayım Kontrolör
William T.

Bul Menüsü'nü ve ardından Projede Bul ve Değiştir? Belki? Ama o iç içe geçmiş olsun lanet olsun ... hmmm .... dunno. iyi soru!
atlwx

prefersStatusBarHidden asla çağrılmaz
Bagusflyer

6
Eğer ihtiyacınız yoksa ihtiyacınız get { }yok set, sadece yazınreturn true
Daniel

16

Swift 3.x'te:

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}

Bu, iOS 9.0'da kullanımdan kaldırıldı
Georgios

16

Info.plist'inize gidin ve iki Anahtar ekleyin:

Info.plist'inize gidin ve iki Anahtar ekleyin:


12

Dolayısıyla buradaki sorunun Swift ile hiçbir ilgisi yok, ancak durum çubuğu görünümünün iOS 7'den itibaren nasıl ele alındığı.

Varsayılan olarak, görünüm denetleyicileri ekrandayken durum çubuğunun görünümünü tek tek kontrol eder. Durum çubuğunu kontrol etme yöntemini kullanmak istiyorsanız, görünümünü değiştirmek istediğiniz görünüm denetleyicileri için aşağıdaki yöntemleri geçersiz kılabilirsiniz:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation,

Sizin durumunuzda, sadece uygulayıp prefersStatusBarHiddengeri dönersiniz true.

Diğer yol, durum çubuğu görünümünü uygulama düzeyinde kontrol etmektir. (Ayarlayarak application.statusBarHidden) aslında yapmaya çalıştığınız gibi görünüyor .

Bunu yapmak için, uygulamanızın Info.plistdosyasını açmanız ve anahtarı eklemeniz UIViewControllerBasedStatusBarAppearanceve bir değer vermeniz gerekir NO.


1
Sanırım prefersStatusBarHidden için geri dönüş demek istiyorsun . NO , ObjC'ye aittir ve yine de yanlış bool değeridir.
HenryRootTwo

@HenryRootTw. Dosyasında değil. Orada hala EVET / HAYIR kullanıyoruz
Alex Salom

8

Aslında bunu kendim anladım. Çözümümü başka bir seçenek olarak ekleyeceğim.

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}

İşleri temiz ve modüler tutmak için güzel bir yaklaşım
Roger Fernandez Guri

2
Bunu uygulayamıyorum. Belki de şimdi Swift 1.2 kullandığım için. Şu hatayı alıyorum: "Method 'prefersStatusBarHidden ()' Objective-C seçicisiyle 'prefersStatusBarHidden' aynı Objective-C seçicisiyle önceki bildirimle çakışıyor". Ayrıca başlangıçta geçersiz kılma anahtar sözcüğünü ekledim, ancak yine de aynı hatayı alıyorum.
Andrej

Bunu her görünüme eklemeniz mi gerekiyor?
Sean

Swift 2'de çalışmaz, yukarıdaki @Andrej tarafından açıklandığı gibi hata gösterir.
Nagendra Rao

4

Tamam, bu yüzden bu benim için bir sorun haline geldi çünkü iOS 9, insanların burada bahsettiği yöntemin üzerinde UIApplication.sharedApplication().statusBarHidden = true veya

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)

ve

override func prefersStatusBarHidden() -> Bool {
     return true
}

çalışır ancak bir koşulda değiştirebileceğim programlanabilir bir çözüm sağlamaz. ( statusBarHidden = trueve statusBarHidden = falsedaha önce yaptığımız gibi).

Bu deliliğe çözüm:

İçin ekleyerek prefersStatusBarHidden()programlı saklambaç kontrol etmek ve eklemeden durum çubuğunun gösterebilir aşağıda gibi UIViewControllerBasedStatusBarAppearancesizin ayarı Info.plist :

var showStatusBar = true

override func prefersStatusBarHidden() -> Bool {
     if showStatusBar {
         return false
     }
     return true
}

private func showStatusBar(enabled: Bool) {
    showStatusBar = enabled
    prefersStatusBarHidden()
}

kodunuz boyunca şu şekilde kullanın:

//Hide Status Bar
showStatusBar(false)

VEYA

//Show Status Bar
showStatusBar(true)

1
Mu prefersStatusBarHiddenhiç mantıklı çağıran? Sanırım atamadan self.setNeedsStatusBarAppearanceUpdate()sonra demek istedinizshowStatusBar
Leo

Gerçekten delilik, değil mi? Ne yazık ki, bu çok uzun zamandır. Bu tür şeyler iOS gelişimini zaman zaman inanılmaz derecede sinir bozucu hale getiriyor.
Womble

@Womble, evet ve oldukça karmaşık hale gelebilir. Umarım Swift 3.0 daha iyi bir kütüphaneye sahiptir ve ilk bakışta olduğu gibi, çok hızlı bir şekilde 2.3'ten çok şey değiştirecek ...
CodeOverRide

Metodunuzdan prefersStatusBarHidden öğesini çağırmak yerine setNeedsStatusBarAppearanceUpdate
Oscar

4

Sadece eklemek için, prefersStatusBarHiddenyöntem veya değişkeni geçersiz View controller-based status bar appearancekılarken, Info.plist içindeki EVET olmalıdır, aksi takdirde geçersiz kılmanın bir etkisi olmaz


4

Swift 4.2 şimdi bir özelliktir.

override var prefersStatusBarHidden: Bool {
    return true
}

3

Benim durumumda, talep üzerine gizlemek / göstermek için durum çubuğunu arıyordum; görünüm yüklendiğinde veya kaybolduğunda değil.

hızlı 3.x

//show status bar initially
var showStatusBar = true

//set the parameters
override var prefersStatusBarHidden: Bool {

    if showStatusBar == true {

        //does not prefer status bar hidden
        print("does not prefer status bar hidden")
        return false

    } else {

        //does prefer status bar hidden
        print("does prefer status bar hidden")
    return true

    }
}

//ex: hide status bar and call parameter function again whenever you want
        showStatusBar = false
        setNeedsStatusBarAppearanceUpdate()

3

Swift 5: Ana görünüm denetleyicisinde veya varsa ana gezinme denetleyicisinde,

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

Ve plist'teki "Denetleyici tabanlı durum çubuğu görünümünü görüntüle" EVET olmalıdır, aksi takdirde yukarıdaki kod çağrılmaz.

Uygulamayı başlatırken durum çubuğunu gizlemek istiyorsanız, plist'te "Durum çubuğu başlangıçta gizlidir" EVET olmalıdır. Bu, ekranın üst kısmında fazladan mavi çubuk gösterildiğinde başlatma görüntüsünün bozulmasını önleyebilir.


2

Benim için çalışan bir çözüm; yükleme sırasında belirli bir görünüm denetleyicisindeki durum çubuğunu gizlemek istiyorsanız:

import UIKit

class ViewController: UIViewController {

private var hideStatusBar: Bool = false

override var prefersStatusBarHidden: Bool {
    return hideStatusBar
}

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
    return UIStatusBarAnimation.slide
}

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundcolor = .white
    hideStatusBar = true

    UIView.animate(withDuration: 0.3) {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}

Dikkat: Eğer anahtar "ayarlarsanız Görünüm denetketiyicili durum çubuğu görünümü " ile " NO sizin Info.plist içinde" kod yukarıdaki eser yok. Anahtarı " EVET " olarak ayarlamanız veya info.plist'den kaldırmanız gerekir.


Bir saklanan özellik olduğundan hideStatusBar özelliğini geçersiz kılamazsınız! ancak başka bir ad seçebilirsiniz ve animasyonunuz çalışır.
XcodeNOOB

2

Projenizde Genel-> Dağıtım Bilgisi-> Durum çubuğu stili Durum çubuğunu gizle onay işaretini seçin Not: - uygulama boyunca durum çubuğunu gizler


1
Bu benim için işe yarar (ios 12), plist cevaplarının olmadığı.
1919'da

2

Swift 4+ için aşağıdaki kodu deneyin (Swift 4.0, 4.1 - IOS 10, 11 üzerinde test edilmiştir):

override var prefersStatusBarHidden: Bool { return true }

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // call this func to force preferredStatusBarStyle to be read again.
    setNeedsStatusBarAppearanceUpdate()
}

2

Swift 5+

Benim durumumda, bazı koşullara göre gizlenmiş durum çubuğunu güncellemem gerekiyor.

Bu nedenle BaseViewController, yeni özellik içeren bir temel denetleyicisi oluşturuyorumhideStatusBar .

Diğer görünüm denetleyicileri bu temel denetleyicinin alt sınıfıdır. Son olarak, durum çubuğu davranışını güncellemek istediğimde, sadece bu hideStatusBardeğeri değiştirmem gerekiyor .

class BaseViewController: UIViewController {

    var hideStatusBar: Bool = false {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

Nasıl kullanılır

final class ViewController: BaseViewController, UIScrollViewDelegate {
    let scrollView = UIScrollView()

    ...

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 100 {
                self.hideStatusBar = true
            } else {
                self.hideStatusBar = false
            }
        }
    }
}

gösteri

İşte bir demo, UIView.animate(...)geçişi daha pürüzsüz hale getirmek için kullanıyorum .

resim açıklamasını buraya girin


1

Xcode 8.1 (8B62) dağıtım hedefi 10.1 olarak ayarlıyorum ve yukarıda belirtilen geçersiz kılma seçenekleri ile çok şansım olmadı. Ancak, Dağıtım Bilgileri'ndeki "Durum çubuğunu gizle" seçeneğini işaretlemek benim için hile yaptı.

Proje> Genel

Umarım bu yardımcı olur.


1

Görünüm denetleyicisini kalıcı olarak sunuyorsanız,

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true

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

4
Bir soruyu cevaplarken lütfen cevabınızı açıklayın, kod pasajı doğru bir cevap değildir.
LazerBanana

0

Bu kodu, ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }

Cevabınız için teşekkür ederim, biraz daha özen göstermeyi umuyor musunuz? Tam olarak nerede kod satırını eklemesi gerekir ve bu neden işe yarar? Bkz yapmak nasıl iyi bir cevap yazma bölümü.
9953-div-37

0

Proje-> Genel-> Dağıtım bilgilerinizde

Durum Çubuğu Stili: -

durum çubuğunu gizle (iOS 10) olarak işaretlendi


0

Hızlı 4

//MARK:- Show Status Bar
UIApplication.shared.isStatusBarHidden = false

//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true

Tamam şimdi i donot herhangi bir ios 12 yok 11.4 zaman onun güncellemesi ben de düzeltir, ayrıca teamviewer varsa ben gelip sisteminizde düzeltmek olacak
Shakeel Ahmed

kullanımdan kaldırıldı
Vyachaslav Gerchicov

0

İOS 13 ve Swift 5 için güncellendi

Yukarıdaki cevapların hiçbiri sizin için uygun değilse. Bunun olup olmadığını görmek için plistinizi kontrol edin:

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

Eğer öyleyse, EVET olarak ayarladığınızdan emin olun !!!!!

Sonra aşağıdaki kod çalışacaktır.

override var prefersStatusBarHidden: Bool {
    return true
}
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.