मैं स्विफ्ट आईओएस ऐप में स्टेटस बार कैसे छिपा सकता हूं?


201

मैं स्क्रीन के शीर्ष पर स्थित स्थिति पट्टी को निकालना चाहूंगा।

यह काम नहीं करता:

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

मैंने भी कोशिश की है:

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
}

जवाबों:


449

आपको वास्तव में अपने दृश्य नियंत्रक (ओं) पर वरीयताएँ लागू करनी चाहिए:

स्विफ्ट 3 और बाद में

override var prefersStatusBarHidden: Bool {
    return true
}

4
मुझे लगता है कि जे का इरादा पूर्ण ऐप के लिए स्टेटस बार को छिपाने का है। यही कारण है कि वह आवेदन के doFinishLaunchingWithOptions में छिपा कार्यक्षमता लिखा होगा। पूर्ण ऐप के लिए स्थिति पट्टी को कैसे छिपाएं?
सत्यम

@ सत्यम के पास अच्छी बात है, पूरे आवेदन के दौरान इसे हटाना अच्छा होगा। क्या विरासत के माध्यम से इसे लागू करने के लिए एक दृष्टिकोण है? या प्रोटोकॉल एक्सटेंशन के माध्यम से?
डैन ब्यूलियू

3
@DanBeaulieu मुझे लगता है कि विरासत के माध्यम से एक महान समाधान होगा। एक UIViewController उपवर्ग बनाएं जहां बार छिपा हुआ सच पर सेट है और फिर उसी से अपने सभी उपकोशों को इनहेरिट करें। एक और दृष्टिकोण स्विज़लिंग
संकटग्रिगा

1
स्विफ्ट 3 कोड से काम नहीं चला, देखें: stackoverflow.com/a/38902285/129202
जॉनी

1
इस पद्धति में एक खराबी है: जब आप एक सेगमेंट करना चाहते हैं, तो आपके वर्तमान दृश्य का अभिभावक दृश्य लगभग 20 px तक गिर जाता है
iman kazemayni

99
  1. Info.plist फ़ाइल पर जाएं
  2. उन पंक्तियों में से एक पर होवर करें और (+) और (-) बटन दिखाई देगा।
  3. पूंजी V के साथ शुरू होने वाले नए कुंजी प्रकार को जोड़ने के लिए प्लस बटन पर क्लिक करें और स्वचालित रूप से पहली पसंद नियंत्रक-आधारित स्थिति बार उपस्थिति होगी।
  4. कुंजी के रूप में जोड़ें।
  5. VALUE को "NO" पर सेट करें
  6. आप AppDelegate.swift पर जाएं
  7. विधि के अंदर, कोड जोड़ें

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

किया हुआ! अपना ऐप चलाएं और कोई और स्टेटस बार नहीं!


1
पहले तो मुझे लगा कि इस समाधान ने ठीक काम किया है, लेकिन फिर मैंने देखा कि यह एक त्रुटि का कारण बनता है जिसे मुझे CG_CONTEXT_SHOW_BACKTRACE के साथ डीबग करने की आवश्यकता थी। "दृश्य नियंत्रक-आधारित स्थिति बार उपस्थिति" को जोड़ने के लिए इसे वापस ले लिया गया
सीन

IOS 9 2.2 में मेरे लिए ठीक काम किया
uplearnedu.com

1
IOS 10.1 सिम्युलेटर के लिए काम किया। धन्यवाद, @nycdanie
जेरोम

7
"कंट्रोलर आधारित स्टेटस बार उपस्थिति" को NO पर सेट करने के अलावा, "स्टेटस बार शुरू में छिपा हुआ है" को "YES" पर सेट करें। फिर आपको व्यू कंट्रोलर में कोड जोड़ने की जरूरत नहीं है और पूरे एप्लिकेशन में स्टेटस बार छिपाया जाएगा। Xcode 8.1, स्विफ्ट 3.0.1, iOS 10
tylerSF

1
@tylerSF महान काम करता है! आपको इसे उत्तर के रूप में जोड़ना चाहिए :)
Pétur Ingi Egilsson

72

स्विफ्ट 3

में Info.plistसेट View controller-based status bar appearanceहैNO

और कॉल करें UIApplication.shared.isStatusBarHidden = true


1
यदि यह हाँ पर सेट है, तो यह एकमात्र तरीका है कि यह काम करेगा।
farzadshbfn

@farzadshbfn यह सही नहीं है। जैसा कि मेरे द्वारा बताया और परखा गया है, यह बूलियन NO के साथ काम करता है।
कोडेटर्ड

43

यदि आप बटन टैप पर स्टेटस बार को छिपाना और वापस लाना चाहते हैं , जबकि स्लाइड-इन मेनू को प्रस्तुत और खारिज करते समय , पॉपअप आदि , तो आप इस विधि का उपयोग कर सकते हैं: -

स्थिति पट्टी छिपाने के लिए: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

स्टेटस बार वापस लाने के लिए: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 

यह एक हैक की अधिक है। मैं खिड़की के साथ इस तरह से मध्यस्थता नहीं करना चाहता ... खासकर अगर एक समाधान पहले से मौजूद है। मैं डेवलपर्स को prefersStatusBarHiddenसंपत्ति को ओवरराइड करने के लिए प्रोत्साहित करता हूं जैसे कि पहले ही उल्लेख किया गया है।
स्टीफन पॉल

2
इसका उपयोग तब किया जा सकता है जब हम छिपाना चाहते हैं और स्टेटस बार को वापस लाना चाहते हैं .. मेरे ऐप में, जब स्लाइडर मेनू बाईं ओर से आता है, तो मुझे स्टेटस बार को छिपाना होगा। और जब मेनू गायब हो जाता है, तो हमें स्टेटस बार को वापस लाना होगा, जैसे जीमेल के आईओएस ऐप में। इसलिए इस तरह के परिदृश्य में हम इसका उपयोग कर सकते हैं।
विंसेंट जॉय

3
यह एक हैक है, और मैं इसके साथ मध्यस्थता नहीं करूंगा, लेकिन यह फिलहाल काम करता है । आप सभी का कहना। इसके साथ समस्या prefersStatusBarHiddenयह है कि अवरोधों और नेविगेशन पट्टियों का उपयोग करके स्टेटस बार से बंधे विचार, खराब स्थिति में घूमेंगे यदि आप स्टेटस बार को चालू / बंद उपयोग कर रहे हैं prefersStatusBarHidden । फिलहाल केवल यही जवाब काम करता है।
जॉनी

@ जॉनी के साथ पूरी तरह से सहमत हूं, मुझे यह समाधान पसंद नहीं है लेकिन जैसे उन्होंने कहा, ओवरराइडिंग prefersStatusBarHiddenआपके अवरोध को गड़बड़ कर देगा। अब तक यह काम करता है। हालाँकि, मैं
सिंगलेट्स

34

यदि आप कोडिंग के बजाय एक दृश्य दृष्टिकोण पसंद करते हैं, तो इस पद्धति का उपयोग करें: अपने में info.plist

यहां छवि विवरण दर्ज करें बस जोड़ने View controller-based status bar appearanceके लिएNO

और के Status bar is initially hiddenरूप मेंYES


यह 2018 में विहित उत्तर है
क्रिस

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

IOS 10 / Swift 3.0 के लिए अपडेट

अब कोई फंक्शन नहीं, अब प्रॉपर्टी ...

override var prefersStatusBarHidden: Bool {
    return true
}

क्या आप जानते हैं कि इसे पूरे ऐप में कैसे सेट किया जाता है, मुझे वर्तमान में प्रत्येक दृश्य में इसे दर्ज करना होगा
विलियम टी।

खोजें मेनू का प्रयास करें, फिर प्रोजेक्ट में खोजें और बदलें? शायद? लेकिन उस नेस्टेड ब्रेस के साथ डार एक्स्ट्रा ब्रेस ... ह्म्म्म .... दुन्नो। अच्छा प्रश्न!
atlwx

प्रेफरस्टैटसबर्हाइड को कभी नहीं कहा जाता है
Bagusflyer

6
आप की जरूरत नहीं है get { }अगर आपके पास नहीं है set, तो बस लिखेंreturn true
डैनियल


16

अपनी Info.plist पर जाएं और दो कुंजी जोड़ें:

अपनी Info.plist पर जाएं और दो कुंजी जोड़ें:


12

इसलिए यहाँ समस्या का वास्तव में स्विफ्ट से कोई लेना-देना नहीं है, लेकिन सिर्फ स्थिति पट्टी उपस्थिति को iOS 7 के रूप में कैसे नियंत्रित किया जाता है।

डिफ़ॉल्ट रूप से, व्यू कंट्रोलर व्यक्तिगत रूप से स्क्रीन पर होने पर स्टेटस बार की उपस्थिति को नियंत्रित करते हैं। यदि आप स्टेटस बार को नियंत्रित करने के इस तरीके का उपयोग करना चाहते हैं, तो आप निम्नलिखित तरीकों को ओवरराइड कर सकते हैं, जो कुछ भी कंट्रोलर आप उपस्थिति को संशोधित करना चाहते हैं:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation ,

आपके मामले में, आप बस लागू करेंगे prefersStatusBarHiddenऔर वापस लौटेंगेtrue

दूसरा तरीका आवेदन स्तर पर स्थिति पट्टी उपस्थिति को नियंत्रित करना होगा। ऐसा लगता है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं (सेटिंग द्वाराapplication.statusBarHidden )।

इस कार्य को करने के लिए, आपको अपने ऐप की Info.plistफ़ाइल को खोलना होगा और कुंजी को जोड़ना होगा UIViewControllerBasedStatusBarAppearance, और इसे एक मूल्य देना होगा NO


1
मुझे लगता है कि आप का मतलब है कि प्रीफरस्टैटसबर्हाइड के लिए सही वापसीNO, ObjC का है और वैसे भी गलत बूल वैल्यू है।
हेनरी रुटट्वो

@HenryRootTwo .plist फ़ाइलों में नहीं। अब भी हम
एलेक्स सैलोम

8

मैं वास्तव में यह पता लगा लिया। मैं एक अन्य विकल्प के रूप में अपना समाधान जोड़ूंगा।

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

चीजों को साफ और मॉड्यूलर रखने के लिए अच्छा तरीका
रोजर फर्नांडीज गुरी

2
मैं इसे लागू नहीं कर सकता। शायद यह है क्योंकि अब मैं स्विफ्ट 1.2 का उपयोग करता हूं। मैं त्रुटि प्राप्त कर रहा हूं: "ऑब्जेक्टिव-सी सेलेक्टर के साथ" विधि 'प्रीफरस्टैटसबर्हाइड ()' प्रीफरेंसटैटसबर्हिड 'के साथ समान ऑब्जेक्टिव-सी चयनकर्ता के साथ पिछले घोषणा के साथ संघर्ष "। मैंने शुरुआत में ओवरराइड कीवर्ड भी जोड़ा है, लेकिन फिर भी वही त्रुटि मिलती है।
Andrej

क्या आपको इसे हर दृष्टिकोण से जोड़ने की आवश्यकता है?
सीन

स्विफ्ट 2 में काम नहीं करता है, त्रुटि दिखाता है जैसा कि ऊपर @Andrej द्वारा समझाया गया है।
नागेंद्र राव

4

ठीक है, इसलिए यह मेरे लिए एक समस्या बन गया है क्योंकि iOS 9 किसी भी उपरोक्त विधि का समर्थन नहीं करता है जिसका लोगों ने यहां उल्लेख किया है जैसे UIApplication.sharedApplication().statusBarHidden = true या

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

तथा

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

काम करता है, लेकिन जहां मैं एक शर्त पर बदल सकते हैं कार्यक्रम समाधान प्रदान नहीं करता है। ( statusBarHidden = trueऔरstatusBarHidden = false जैसा कि हमने पहले किया है)।

इस पागलपन का समाधान:

को जोड़ कर prefersStatusBarHidden()नीचे आप प्रोग्राम छिपाने को नियंत्रित करने और जोड़ने के बिना स्थिति पट्टी के दिखा सकते हैं चाहते UIViewControllerBasedStatusBarAppearanceअपने को स्थापित करने Info.plist :

var showStatusBar = true

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

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

फिर इसे अपने पूरे कोड में इस तरह उपयोग करें:

//Hide Status Bar
showStatusBar(false)

या

//Show Status Bar
showStatusBar(true)

1
क्या prefersStatusBarHiddenकॉलिंग का कोई मतलब है? मुझे लगता है कि आपको असाइन करने के self.setNeedsStatusBarAppearanceUpdate()बाद मतलब हैshowStatusBar
लियो

यह वास्तव में पागलपन है, है ना? यह कितनी दयनीय एपीआई है, और इतने लंबे समय से है। इस तरह की चीज कई बार iOS के विकास को अविश्वसनीय रूप से निराशाजनक बना देती है।
Womble

@ हां, हां और यह बहुत जटिल हो सकता है। उम्मीद है कि स्विफ्ट 3.0 में एक बेहतर लाइब्रेरी है और यह पहली नज़र में ही सपोर्ट करता है, यह स्विफ्ट 2.3 ... ब्रेकिंग स्टफ से बहुत कुछ बदलने वाला है।
कोडओवरराइड

इसके बजाय अपने विधि से prefersStatusBarHidden बुलाने की, आप setNeedsStatusBarAppearanceUpdate कह सकते हैं
ऑस्कर

4

जानकारी prefersStatusBarHiddenया चर को ओवरराइड करने के View controller-based status bar appearanceदौरान, Info.plist में हां जोड़ना चाहिए, अन्यथा ओवरराइड का कोई प्रभाव नहीं होगा



3

मेरे मामले में, मैं मांग पर छिपाने / दिखाने के लिए स्थिति बार की तलाश कर रहा था; इसके बजाय जब दृश्य लोड या गायब हो जाता है।

स्विफ्ट 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

स्विफ्ट 5: यदि आपके पास मुख्य दृश्य नियंत्रक, या मुख्य नेविगेशन नियंत्रक है,

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    override var prefersStatusBarHidden: Bool {
        return false
    }

और प्लिस्ट में "कंट्रोलर-आधारित स्टेटस बार उपस्थिति" हां होना चाहिए, अन्यथा उपरोक्त कोड नहीं कहा जाएगा।

यदि आप ऐप लॉन्च करते समय स्टेटस बार को छिपाना चाहते हैं, तो प्लिस्ट में "स्टेटस बार शुरू में छिपा हुआ है" YES होना चाहिए। यह लॉन्च की छवि को विकृत होने से रोक सकता है जब स्क्रीन टॉप पर अतिरिक्त ब्लू बार दिखा रहा हो।


2

एक समाधान जो मेरे लिए काम करता है; यदि आप लोड करते समय किसी विशिष्ट दृश्य नियंत्रक पर स्थिति पट्टी को छिपाना चाहते हैं:

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

ध्यान दें: यदि आप अपनी जानकारी में " NO " के लिए " कंट्रोलर-आधारित स्टेटस बार उपस्थिति " कुंजी सेट करते हैं। ऊपर दिए गए कोड पर काम नहीं करता है। आपको " YES " की कुंजी सेट करनी चाहिए या इसे info.plist से हटा देना चाहिए


आप HideStatusBar संपत्ति को ओवरराइड नहीं कर सकते क्योंकि यह एक संग्रहीत संपत्ति है! हालांकि आप सिर्फ एक और नाम चुन सकते हैं और आपका एनीमेशन काम करेगा।
XcodeNOOB

2

आपके प्रोजेक्ट में सामान्य-> परिनियोजन जानकारी-> स्टेटस बार स्टाइल हाईड स्टेटस बार के चेक मार्क को चुनें नोट: - यह पूरे एप्लीकेशन में स्टेटस बार को छुपाता है


1
यह मेरे लिए काम करता है (ios 12), जहां प्लिस्ट उत्तर नहीं देते हैं।
तीन

2

स्विफ्ट 4+ के लिए निम्न कोड आज़माएं (स्विफ्ट 4.0, 4.1 - आईओएस 10, 11 पर परीक्षण)

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

स्विफ्ट 5+

मेरे मामले में, मुझे कुछ शर्तों के आधार पर छिपी स्थिति पट्टी को अपडेट करने की आवश्यकता है।

इस वजह से, मैं एक आधार नियंत्रक बनाता हूं BaseViewControllerजिसमें नई संपत्ति होती हैhideStatusBar

अन्य दृश्य नियंत्रक इस आधार नियंत्रक के उप-वर्ग हैं। अंत में जब मैं स्थिति बार व्यवहार को अपडेट करना चाहता हूं, तो मुझे केवल इस hideStatusBarमान को बदलने की आवश्यकता है ।

class BaseViewController: UIViewController {

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

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}

कैसे इस्तेमाल करे

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

डेमो

यहाँ एक डेमो है, मैं UIView.animate(...)संक्रमण को आसान बनाने के लिए उपयोग कर रहा हूँ ।

यहां छवि विवरण दर्ज करें


1

मैं 10.1 पर सेट परिनियोजन लक्ष्य के साथ Xcode 8.1 (8B62) का उपयोग कर रहा हूं और मुझे ऊपर बताए गए ओवरराइड विकल्पों के साथ ज्यादा भाग्य नहीं मिला है। हालाँकि, परिनियोजन जानकारी में "स्थिति छिपाएं बार" विकल्प की जाँच ने मेरे लिए चाल चली।

प्रोजेक्ट> जनरल

आशा है कि ये आपकी मदद करेगा।


1

यदि आप दृश्य नियंत्रक को औपचारिक रूप से प्रस्तुत कर रहे हैं, तो प्रयास करें

viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true

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

4
किसी प्रश्न का उत्तर देते समय, कृपया अपना उत्तर स्पष्ट करें, कोड स्निपेट एक उचित उत्तर नहीं है।
लेज़रबाना

0

आप इस कोड को अपने में उपयोग कर सकते हैं ViewController Class scope

open override var prefersStatusBarHidden: Bool { return true }

उत्तर के लिए धन्यवाद, क्या आप थोड़ा और विस्तृत करने की परवाह करते हैं। वास्तव में उसे कोड की पंक्ति को कहाँ जोड़ना चाहिए और यह क्यों काम करेगा? देखें कि मैं कैसे एक अच्छा उत्तर अनुभाग लिखता हूं
9953-डिव -37

0

अपने प्रोजेक्ट में- सामान्य-> तैनाती की जानकारी

स्थिति शैली: -

बस छिपा स्थिति पट्टी (iOS 10) चिह्नित


0

स्विफ्ट 4

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

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

अभी के लिए ठीक है, मेरे पास कोई भी ios 12 नहीं है मेरे पास 11.4 है जब इसका अपडेट मैं इसे ठीक कर दूंगा, साथ ही अगर आपके पास टीमव्यूअर है तो मैं इसे आपके सिस्टम पर आकर ठीक कर दूंगा
शकील अहमद

यह पदावनत किया गया है
व्याचेस्लाव गेरिकोव

0

IOS 13 और स्विफ्ट 5 के लिए अपडेट किया गया

यदि उपरोक्त उत्तरों में से कोई भी आपके लिए काम नहीं करता है। यह देखने के लिए कि क्या आपके पास यह देखने के लिए अपनी जाँच करें:

"नियंत्रक-आधारित स्थिति बार उपस्थिति देखें"

यदि हां, तो इसे हाँ में सेट करना सुनिश्चित करें !!!!!

फिर निम्न कोड काम करेगा।

override var prefersStatusBarHidden: Bool {
    return true
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.