iOS 7 और बाद में: प्रति दृश्य कंट्रोलर में स्टेटस बार स्टाइल सेट करें


79


मैंने स्टेटस बार स्टाइल (डिफॉल्ट या लाइटकंटेंट) सेट करने के कई तरीके आज़माए, लेकिन इसे प्रति व्यू कंट्रोलर के आधार पर काम नहीं कर सकता। मैं केवल पूरे ऐप के लिए स्टेटस बार स्टाइल सेट कर सकता हूं।

क्या किसी को कोई संकेत मिला है?

मैंने कोशिश की UIViewControllerBasedStatusBarAppearance

तथा

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
}

लेकिन ये तरीके काम नहीं करते हैं।



1
और सुनिश्चित करें कि नेविगेशन बार को स्टेटस बार के साथ ओवरलैप नहीं किया जाना चाहिए ....
रजनीश071

मैंने इसके लिए (और दृश्यमान / छिपी हुई स्थिति को नियंत्रित करने के लिए) एक छोटी सी चाल का उपयोग किया - मैंने इसे फली 'UIViewController + ODStatusBar' ( cocoapods.org/pods/UIViewContil+ODStatusBar ) के रूप में प्रकाशित करने का निर्णय लिया
एलेक्स नाजर्स्की

1
यह दर्जनों एपीआई में से एक है जो कि Apple आईओएस के एक संस्करण से दूसरे के व्यवहार को बेतरतीब ढंग से बदलता है और किसी कारण से पूर्ण डेवलपर विद्रोह नहीं हुआ है। IOS के संस्करण को फिट करने के लिए आपको अपने कार्यान्वयन को संशोधित करना होगा जो कि आपका ऐप चल रहा है और हर बार जब आप नए संस्करण के लिए निर्माण करते हैं, तो उसका परीक्षण करें।
ब्रॉन डेविस

जवाबों:


139

क्या आपने यह कोशिश की है?

  1. अपने Info.plist में "नियंत्रक-आधारित स्थिति बार उपस्थिति" ( UIViewControllerBasedStatusBarAppearance) सेट करें YES। ( YESडिफ़ॉल्ट है, इसलिए आप इस मूल्य को सिर्फ अपनी मुट्ठी से बाहर कर सकते हैं।)

  2. अपने viewDidLoad विधि में, कॉल करें [self setNeedsStatusBarAppearanceUpdate]

  3. कार्यान्वयन preferredStatusBarStyle, उस स्थिति बार शैली को वापस करना जो आप इस दृश्य नियंत्रक के लिए चाहते हैं।

    - (UIStatusBarStyle) preferredStatusBarStyle { 
        return UIStatusBarStyleLightContent; 
    }
    


2
Iphone 5 + ios7 के लिए यह रंग काम करता है। UIViewControllerBasedStatusBarAppearance NO और [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackTranscucent]; मेरे मामले के लिए ठीक काम कर रहा है :)
फेमिना

4
@vishal UINavigationController आधारित एप्स के साथ काम करता है अगर आप उस कोड को अपने कस्टम UINavigationController
सबक्लास में डालते हैं

3
आपको दूसरे चरण की आवश्यकता नहीं है।
बेन एफ्लेक

4
IOS 8 में मेरे लिए काम नहीं करता है। यह सिर्फ डिफ़ॉल्ट बदलता है। मुझे सफ़ेद होने की क्या आवश्यकता थी, अब डिफ़ॉल्ट पर जाता है।
noobsmcgoobs

74

यहाँ एक पकड़ है अगर आपका व्यू कंट्रोलर स्टैंडअलोन UINavigationController के अंदर है और स्टोरीबोर्ड आधारित UINavigationController का हिस्सा नहीं है, तो सभी तरीकों से ऊपर। मैं इस स्थिति में आया था और फिर प्रकाश शैली के लिए स्थिति पट्टी सेट करने के लिए मैंने निम्नलिखित का उपयोग किया

[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];

इसने मेरे लिए पूरी तरह से काम किया।


7
यदि आपका नेविगेशन कंट्रोलर का नेविगेशन बार छिपा हुआ है तो काम नहीं करता है।
MLQ

इसी तरह की सलाह एक UISplitViewController पर लागू होती है। मैंने उपवर्ग समाप्त कर दिया।
स्टीफन डार्लिंगटन

1
मेरी समझ के अनुसार, UINavigationBar.barStyleओवरराइड करता है preferredStatusBarStyle। कोई फर्क नहीं पड़ता कि आप कैसे सेट करते हैं preferredStatusBarStyle, एक लानत `UINavigationBar.setBarStyle 'सब कुछ संभालती है।
डेसमंड DAI

22

EDIT: यह समाधान iOS 9 पर चित्रित किया गया है। कृपया अन्य उत्तरों में से एक का चयन करें।

UIViewControllerBasedStatusBarAppearanceNO पर सेट के साथ , मैं शैली को सफेद पाठ में सेट करने में सक्षम था:

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;

ऐसा इसलिए है क्योंकि इस शैली का पाठ रंग iOS 6 और उससे नीचे पर सफेद था।

अद्यतन: @jowie के अनुसार आप iOS8 पर कोशिश कर सकते हैं:

[UIApplication sharedApplication].statusBarStyle = UIBarStyleBlack;

क्या आपने प्रश्न को ध्यान से पढ़ा? वह iOS7 समाधान के लिए पूछ रहा है और इसके प्रकाश की शैली भी अंधेरा नहीं है जो आपके मामले में है।
विंध्य चरण

यह iOS7 पर काम करता है। मैंने इसे ध्यान से पढ़ा। और UIBarStyleBlackTranslucent के बारे में, यह काम करता है क्योंकि iOS6 पर यह शैली सफेद पृष्ठभूमि के साथ काली पृष्ठभूमि (पारभासी) थी। जब आप iOS7 पर ऐसा करते हैं, तो यह केवल टेक्स्ट को सफेद रंग में दिखाता है। मुझे पता है कि यह हैकिश दिखता है, लेकिन यह एकमात्र तरीका था जिससे मुझे पता चला कि बार को वास्तव में नियंत्रित करना है।
caulitomaz

IOS 8 के लिए, उपयोग करें UIBarStyleBlack
jowie

धन्यवाद @MatthieuRiegler, मैं एक नोटिस डालूँगा।
कुलुताजमाज

14

स्विफ्ट में मैं यह लिखकर करने में सक्षम था:

let tbc : UITabBarController = self.window?.rootViewController as UITabBarController
var moreViewController : UINavigationController = tbc.moreNavigationController

moreViewController.navigationBar.barStyle = UIBarStyle.Black

मूल रूप से आप अंतिम पंक्ति में रुचि रखते हैं।
इससे टैब्बर सफेद में बदल गया:

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

ध्यान दें कि मैंने Info.plistइस परिणाम को प्राप्त करने के लिए कुछ भी नहीं बदला ।
बदलने के संबंध में अधिक जानकारी के लिए Navigation Status Bar, कृपया इस लिंक की जाँच करें: http://www.appcoda.com/customize-navigation-status-bar-ios-7/


यह काम। हालांकि, यह नए "UIStatusBarStyleLightContent" का उपयोग नहीं करता है, मुझे आश्चर्य है कि क्या यह भविष्य के सबूत समाधान है? फिर भी मसला हल करो!
वान दू ट्रान

1
यदि आपका नेविगेशन बार छिपा हुआ है तो यह एक बेहतरीन उत्तर होगा लेकिन काम नहीं करेगा।
MLQ

13

ViewDidLoad विधि पर, इसे डालें:

उद्देश्य सी

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[self setNeedsStatusBarAppearanceUpdate];

तीव्र

UIApplication.shared.statusBarStyle = .lightContent
self.setNeedsStatusBarAppearanceUpdate()

मुझे आपकी मदद करने में खुशी हो रही है गगन
जोटा फ्रीटस जूनियर

अजीब लगता है कि दृश्य नियंत्रक संपूर्ण अनुप्रयोग के लिए एक संपत्ति को अपडेट कर रहा है - समाधान या तो संपूर्ण अनुप्रयोग (जो कि रहता है AppDelegate) या प्रति दृश्य नियंत्रक के लिए होना चाहिए ।
ज़ोरयार

इस विधि का तेजी से समतुल्य UIApplication.saredApplication ()। setStatusBarStyle (UIStatusBarStyle.LightContent, animated: false)
मिनहाज़ुर

इसे कार्य करने के लिए, लक्ष्य गुणों में नियंत्रक आधारित स्थिति बार उपस्थिति को NO पर सेट किया जाना चाहिए। मुझे लगता है कि यह सबसे अच्छा तरीका है क्योंकि यह सरल और स्पष्ट है।
n13

7

मुझे यकीन है कि आपके पास अपना दृश्य नियंत्रक एक नेविगेशन नियंत्रक में एम्बेडेड है। .Blackइस उपवर्ग का उपयोग करने के लिए नेविगेशन बार की शैली को सेट करने से बचने के लिए :

class YourNavigationController: UINavigationController {
    override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return topViewController
    }
}

5

स्विफ्ट:

let tbc : UITabBarController = self.window?.rootViewController as UITabBarController
var moreViewController : UINavigationController = tbc.moreNavigationController
moreViewController.navigationBar.barStyle = UIBarStyle.Black

उद्देश्य सी:

इसे controller.mफ़ाइल व्यूडीड विधि में जोड़ें:

[self setNeedsStatusBarAppearanceUpdate].

फिर उसी controller.mफ़ाइल में इस विधि को लागू करें :

- (UIStatusBarStyle) preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; 
}

आधिकारिक दस्तावेज़:

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html

लेख मैंने अपने ब्लॉग पर लिखा है:

http://www.ryadel.com/2015/03/04/xcode-set-status-bar-style-and-color-in-objective-c/


1

ViewController में आप स्टेटस बार का रंग बदलना चाहते हैं

- (void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}

- (void) viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

0

इसके लिए स्विफ्ट एक्सटेंशन क्योंकि मैं हमेशा भूल जाता हूं कि यह कैसे काम करता है

extension UIViewController {
    // utility to set the status bar appearance
    // Note: Make sure "View controller-based status bar appearance" is set to NO in your target settings or this won't work
    func setStatusBarForDarkBackground(dark: Bool) {
        UIApplication.sharedApplication().statusBarStyle = dark ? .LightContent : .Default
        setNeedsStatusBarAppearanceUpdate()
    }
}

0

Xcode 10.3,

IPhone 8 12.4 सिम्युलेटर में, यह ठीक है।

IPhone X 12.4 सिम्युलेटर में, मैंने उपरोक्त सभी की कोशिश की, ठीक नहीं।

फिर मैं इसे हाथ से जोड़ता हूं, स्टेटस बार में समय, बैटरी, सेलुलर शामिल हैं।

1 1

StatusBarView


class StatusBottomView: UIView {
    private var batteryView:BatteryView!
    private var timeLabel:UILabel!
    private var timer:Timer?

    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubviews()
    }

    private func addSubviews() {
        batteryView = BatteryView()
        batteryView.tintColor = UIColor.blue
        addSubview(batteryView)
        timeLabel = UILabel()
        timeLabel.textAlignment = .center
        timeLabel.font = UIFont.systemFont(ofSize: 12)
        timeLabel.textColor = UIColor.blue
        addSubview(timeLabel)
        didChangeTime()
        addTimer()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        let h = frame.size.height
        let x: CGFloat = 80
        batteryView.frame.origin = CGPoint(x: ScreenHeight - x - DZMBatterySize.width, y: (h - DZMBatterySize.height) / 2)
        timeLabel.frame = CGRect(x: x, y: 0, width: 50, height: h)
    }

    // MARK: -- Timer

    func addTimer() {
        if timer == nil {
            timer = Timer.scheduledTimer(timeInterval: 15, target: self, selector: #selector(didChangeTime), userInfo: nil, repeats: true)
            RunLoop.current.add(timer!, forMode: .common)
        }
    }


    func removeTimer() {
        if timer != nil {
            timer!.invalidate()
            timer = nil
        }
    }


    @objc func didChangeTime() {
        timeLabel.text = TimerString("HH:mm")
        batteryView.batteryLevel = UIDevice.current.batteryLevel
    }

}

BatteryLevelView

class BatteryView: UIImageView {

    override var tintColor: UIColor! {

        didSet{ batteryLevelView.backgroundColor = tintColor }
    }

    /// BatteryLevel
    var batteryLevel:Float = 0 {

        didSet{ setNeedsLayout() }
    }

    /// BatteryLevelView
    private var batteryLevelView:UIView!

    convenience init() {

        self.init(frame: CGRect(x: 0, y: 0, width: DZMBatterySize.width, height: DZMBatterySize.height))
    }


    override init(frame: CGRect) {

        super.init(frame: CGRect(x: 0, y: 0, width: DZMBatterySize.width, height: DZMBatterySize.height))

        addSubviews()
    }

    func addSubviews() {

        batteryLevelView = UIView()
        batteryLevelView.layer.masksToBounds = true
        addSubview(batteryLevelView)

        image = UIImage(named: "battery_black")?.withRenderingMode(.alwaysTemplate)
        tintColor = UIColor.white
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        let spaceW:CGFloat = 1 * (frame.width / DZMBatterySize.width) * HJBatteryLevelViewScale
        let spaceH:CGFloat = 1 * (frame.height / DZMBatterySize.height) * HJBatteryLevelViewScale

        let batteryLevelViewY:CGFloat = 2.1*spaceH
        let batteryLevelViewX:CGFloat = 1.4*spaceW
        let batteryLevelViewH:CGFloat = frame.height - 3.4*spaceH
        let batteryLevelViewW:CGFloat = frame.width * HJBatteryLevelViewScale
        let batteryLevelViewWScale:CGFloat = batteryLevelViewW / 100

        var tempBatteryLevel = batteryLevel

        if batteryLevel < 0 {

            tempBatteryLevel = 0

        }else if batteryLevel > 1 {

            tempBatteryLevel = 1

        }

        batteryLevelView.frame = CGRect(x: batteryLevelViewX , y: batteryLevelViewY, width: CGFloat(tempBatteryLevel * 100) * batteryLevelViewWScale, height: batteryLevelViewH)
        batteryLevelView.layer.cornerRadius = batteryLevelViewH * 0.125
    }

}


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