प्रोग्रामेटिक रूप से iOS स्टेटस बार हाइट कैसे प्राप्त करें


277

मुझे पता है कि वर्तमान में iPhone / iPad के शीर्ष पर स्थिति बार (समय, बैटरी और नेटवर्क कनेक्शन के साथ) गैर-रेटिना स्क्रीन के लिए 20 पिक्सेल और रेटिना स्क्रीन के लिए 40 पिक्सेल है, लेकिन भविष्य के प्रमाण के लिए मेरा ऐप मुझे पसंद आएगा हार्ड कोडिंग मूल्यों के बिना इसे निर्धारित करने में सक्षम होना। क्या प्रोग्राम बार की स्थिति की ऊंचाई का पता लगाना संभव है?

जवाबों:


506

[UIApplication sharedApplication].statusBarFrame.size.height। लेकिन चूंकि सभी आकार बिंदुओं में होते हैं, पिक्सेल में नहीं, स्थिति बार ऊंचाई हमेशा 20 के बराबर होती है।

अपडेट करें। इस उत्तर को सहायक मानते हुए, मुझे विस्तार से बताना चाहिए।

स्थिति बार की ऊँचाई, वास्तव में, निम्नलिखित मामलों को छोड़कर 20.0f अंक के बराबर है :

  • स्टेटस बार को setStatusBarHidden:withAnimation:विधि के साथ छिपाया गया है और इसकी ऊंचाई 0.0f अंक के बराबर है;
  • जैसा कि @Anton ने यहां बताया, फोन एप्लिकेशन के बाहर आने वाली कॉल के दौरान या साउंड रिकॉर्डिंग सेशन के स्टेटस बार की ऊंचाई 40.0f अंक के बराबर होती है।

आपके दृश्य की ऊंचाई को प्रभावित करने वाली स्थिति पट्टी का भी मामला है। आम तौर पर, दृश्य की ऊंचाई दी गई अभिविन्यास माइनस स्थिति बार ऊंचाई के लिए स्क्रीन आयाम के बराबर होती है। हालाँकि, यदि आप दिखाए जाने के बाद स्टेटस बार को दिखाते हैं (इसे दिखाते हैं या छिपाते हैं), स्टेटस बार अपने फ्रेम को बदल देगा, लेकिन व्यू नहीं होगा , आपको स्टेटस बार एनीमेशन (या एनीमेशन के बाद से) के बाद मैन्युअल रूप से व्यू का आकार बदलना होगा एनीमेशन की शुरुआत में स्थिति बार ऊंचाई अंतिम मूल्य पर सेट होती है)।

अद्यतन 2. उपयोगकर्ता इंटरफ़ेस अभिविन्यास का एक मामला भी है। स्थिति पट्टी अभिविन्यास मान का सम्मान नहीं करती है, इस प्रकार पोर्ट्रेट मोड के लिए स्थिति बार ऊंचाई मूल्य है [UIApplication sharedApplication].statusBarFrame.size.height(हाँ, डिफ़ॉल्ट अभिविन्यास हमेशा पोर्ट्रेट होता है, कोई फर्क नहीं पड़ता कि आपका ऐप info.plist क्या कहता है), परिदृश्य के लिए - [UIApplication sharedApplication].statusBarFrame.size.width। जब बाहर UIViewControllerऔर self.interfaceOrientationउपलब्ध नहीं है, तो UI के वर्तमान अभिविन्यास का उपयोग करने के लिए [UIApplication sharedApplication].statusBarOrientation

IOS7 के लिए अपडेट। भले ही स्थिति पट्टी दृश्य शैली बदल गई, यह अभी भी वहां है, इसका फ्रेम अभी भी उसी तरह का व्यवहार करता है। स्थिति पट्टी के बारे में केवल दिलचस्प खोजने मुझे मिल गया - मैं शेयर: अपने UINavigationBar's टाइलों पृष्ठभूमि भी स्थिति पट्टी करने के लिए टाइलों किया जाएगा ताकि आप कुछ दिलचस्प डिजाइन प्रभाव को प्राप्त कर सकते हैं या बस अपने स्थिति पट्टी रंग। यह भी, किसी भी तरह से स्थिति पट्टी ऊंचाई को प्रभावित नहीं करेगा।

नेविगेशन बार टाइल बैकग्राउंड को स्टेटस बार में भी टाई किया जाता है


6
यह विधि 1024 (iOS7)
मार्क

1
@MarcMosby, मेरा अपडेट देखें। इस मुद्दे को याद किया - आपको धन्यवाद।
किरेन डनकॉफ

2
हाँ, जैसा कि मार्क ने iOS7 में बताया है कि यह कभी-कभी 1024 और 20 कभी-कभी खराब हो जाता है। तो यह अब ऊंचाई निर्धारित करने का एक मूर्ख प्रमाण नहीं है। मुझे संदेह है कि यह iOS 8 पर स्टेटस बार की पारदर्शी प्रकृति के कारण है। ऐसा हो सकता है, यह पहले पूरी स्क्रीन पर जाता है और फिर खुद को आकार देता है। इसलिए यदि आप इस परिवर्तन के दौरान पूछताछ करते हैं, तो आपको गलत मान मिल सकता है। देरी के साथ इस विधि को कॉल करना हो सकता है आईओएस 7.
दीपक जीएम

1
एक मामला है जहां स्थिति पट्टी की ऊंचाई शून्य हो सकती है। यदि UIInterfaceOrientationMask के बजाय supportInterfaceOrientations () UIInterfaceOrientation (गलत परिणाम लेकिन कोई संकलक त्रुटि) नहीं लौटाता है और एक व्यूकंट्रोलर प्रस्तुत किया जाता है और खारिज कर दिया जाता है, तो स्टेटस बार की ऊंचाई शून्य हो जाएगी।
Cymric

5
साथ ही iPhone X पर स्टेटस बार ज्यादा होगा।
पूर्व

98

सवाल के मार्टिन के सुझाव के साथ जाएं : iPhone स्थिति बार ऊंचाई प्राप्त करें

CGFloat AACStatusBarHeight()
{
    CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
    return MIN(statusBarSize.width, statusBarSize.height);
}

और स्विफ्ट में

func statusBarHeight() -> CGFloat {
    let statusBarSize = UIApplication.shared.statusBarFrame.size
    return Swift.min(statusBarSize.width, statusBarSize.height)
}

यह एक हैक की तरह लगता है, लेकिन यह वास्तव में बहुत ठोस है। वैसे भी, यह एकमात्र कार्यशील समाधान है।

पुराना उत्तर

निम्नलिखित कोड, जो आपके कस्टम उपवर्ग में जाएगा UIViewController, ने लगभग परिदृश्य को समर्थन देने का काम किया। लेकिन, मैंने एक कोने के मामले पर ध्यान दिया (जब दाएं से घुमाया जा रहा था। तब उल्टा-उल्टा> बाएं), जिसके लिए यह काम नहीं किया (ऊँचाई और चौड़ाई को स्विच किया)।

BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);

यह सही नहीं है। डिवाइस को घुमाते समय स्टेटस बार की ऊंचाई नहीं बदलती है। चौड़ाई होगी, लेकिन ऊपर का कोड यह नहीं दिखाता है, और न ही यह मूल प्रश्न था।
lehn0058

1
आप सही कह रहे हैं कि "जब आप डिवाइस को घुमाते हैं तो स्टेटस बार की ऊंचाई नहीं बदलती है।" लेकिन, जैसा कि ऐश ने जवाब दिया , "लैंडस्केप मोड में, आप पा सकते हैं कि चौड़ाई और ऊंचाई बदली हुई है।" ऊपर दिए गए कोड को ध्यान में रखा गया है।
ma11hew28

यह एक दिलचस्प मुद्दा है जिसे मैं अब भी देख रहा हूं। यह मेरे लिए एप्पल की तरफ से एक बग की तरह लग रहा है, लेकिन अभी भी इसके लिए जिम्मेदार होने की जरूरत है।
lehn0058

2
@ lehn0058 यह बग नहीं है, यह है कि Apple आंतरिक रूप से बार को कैसे संभालता है। यह एक विंडो से जुड़ा हुआ है और उस विंडो को एक ट्रांसफॉर्मेशन का उपयोग करके घुमाया जाता है। statusBarFrameको बदलने से पहले मूल्य के रूप में दिया जाता है।
लियो नटन

1
यह एक संपत्ति के रूप में बेहतर दिखता है: Dvar statusBarHeight: CGFloat
पाब्लो ए।

23

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

CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

1
विभिन्न झुकावों में लौटी ऊंचाई अलग है। यह अजीब है
tililani

1
हां, अगर रोटेशन लैंडस्केप है - [[UIApplication साझाApplication] statusBarFrame] .size.height और [[UIApplication साझाAppApplication] statusBarFrame] .size / इनवॉइस मान स्विच किए जाते हैं।
गुंटिस ट्रेन्डंड


10

जबकि स्टेटस बार आमतौर पर 20pt लंबा होता है, यह कुछ स्थितियों में उस राशि का दोगुना हो सकता है:

  • जब आप एक फोन कॉल के बीच में होते हैं (यह एक बहुत ही सामान्य परिदृश्य है);
  • जब वॉयस रिकॉर्डर, या स्काइप, या एक समान ऐप, पृष्ठभूमि में माइक्रोफ़ोन का उपयोग कर रहा है;
  • जब व्यक्तिगत हॉटस्पॉट सक्रिय हो जाता है;

बस इसे आज़माएँ, और आप अपने लिए देखेंगे। ऊंचाई को 20pt तक हार्डकोड करना आमतौर पर काम करेगा, जब तक कि यह नहीं होता।

तो मैं दूसरे H2CO3 का जवाब:

statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

10

EDIT iOS 11 को अपने व्यू कंटेंट में सबसे ऊपर रखने के लिए काम करने का तरीका है UIView का safeAreaLayoutGuideSee UIView डॉक्यूमेंटेशन

सेवा से बाहर उत्तर आप आईओएस लक्षित कर रहे हैं 7+, UIViewController के लिए दस्तावेज़ की सलाह है कि ViewController के topLayoutGuideसंपत्ति अगर यह भी दिखाई दे रहा है, स्थिति पट्टी के नीचे, नेविगेशन बार के नीचे आप देता है। यह उपयोग का हो सकता है, और पिछले समाधानों की तुलना में निश्चित रूप से कम हैक है।


5

मत भूलो कि स्टेटस बार का फ्रेम स्क्रीन के समन्वय स्थान में होगा! यदि आप लैंडस्केप मोड में लॉन्च करते हैं, तो आप पा सकते हैं कि चौड़ाई और ऊंचाई बदली हुई है। मैं दृढ़ता से अनुशंसा करता हूं कि यदि आप लैंडस्केप ओरिएंटेशन का समर्थन करते हैं तो आप कोड के इस संस्करण का उपयोग करते हैं:

CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];

इसके बाद आप स्टेटसबारफ्रेम की ऊंचाई की संपत्ति को सीधे पढ़ सकते हैं। इस उदाहरण में 'दृश्य' वह दृश्य होना चाहिए जिसमें आप मापों का उपयोग करना चाहते हैं, सबसे अधिक संभावना है कि विंडो की रूट व्यू कंट्रोलर।

संयोग से, न केवल फोन कॉल के दौरान स्थिति बार लंबा हो सकता है, यह शून्य भी हो सकता है यदि स्थिति बार जानबूझकर छिपाया गया हो।


इससे मुझे सही ऊंचाई नहीं मिली। लेकिन, मैंने अपने लिए अलग तरीके से काम किया जो मेरे लिए काम करता है: stackoverflow.com/a/16598350/242933
ma11hew28

हाँ, यह अब बहुत पुराना कोड है इसलिए शायद अब वैध उत्तर नहीं है। व्यक्तिगत रूप से मुझे अब कभी भी ऑटो लेआउट के लिए स्टेटस बार की ऊंचाई की जांच करने की कोई आवश्यकता नहीं है।
ऐश

2

यहाँ स्क्रीन स्थिति बार ऊंचाई पाने के लिए एक स्विफ्ट तरीका है:

var screenStatusBarHeight: CGFloat {
    return UIApplication.sharedApplication().statusBarFrame.height
}

ये मेरा एक प्रोजेक्ट में एक मानक कार्य के रूप में शामिल हैं: https://github.com/goktugyil/EZSwwEEension



1
    var statusHeight: CGFloat!
    if #available(iOS 13.0, *) {
         statusHeight = UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height
    } else {
        // Fallback on earlier versions
        statusHeight = UIApplication.shared.statusBarFrame.height
    }


0

मुझे सिर्फ एक रास्ता मिला जिससे आप सीधे स्टेटस बार की ऊँचाई तक नहीं पहुँच सकते, लेकिन इसकी गणना कर सकते हैं।

नैविगेशन बार की ऊँचाई - topLayoutGuide लंबाई = स्थिति बार ऊँचाई

स्विफ्ट:

let statusBarHeight = self.topLayoutGuide.length-self.navigationController?.navigationBar.frame.height

self.topLayoutGuide.lengthशीर्ष क्षेत्र जो पारभासी पट्टी द्वारा कवर किया गया है, और self.navigationController?.navigationBar.frame.heightस्थिति पट्टी को छोड़कर पारभासी पट्टी है, जो आमतौर पर 44pt है। तो इस विधि का उपयोग करके आप आसानी से फोन कॉल के कारण स्थिति बार ऊंचाई परिवर्तन के बारे में चिंता किए बिना स्थिति बार ऊंचाई की गणना कर सकते हैं।


यह काम नहीं करता है, self.topLayoutGuide.length0 है इसलिए परिणाम -44 तक समाप्त होता है।
नंबेटी

@nambatee मुझे विश्वास है कि यह अब और काम नहीं करता है क्योंकि मैं iOS 11 Apple का उपयोग करता हूँ safeAreaInsets
हेनरी


-6

एकल पंक्ति कोड का उपयोग करके आप किसी भी अभिविन्यास में स्थिति बार ऊंचाई प्राप्त कर सकते हैं और यह भी कि यह दिखाई दे रहा है या नहीं

#define STATUS_BAR_HIGHT (
    [UIApplicationsharedApplication].statusBarHidden ? 0 : (
        [UIApplicationsharedApplication].statusBarFrame.size.height > 100 ?
            [UIApplicationsharedApplication].statusBarFrame.size.width :
            [UIApplicationsharedApplication].statusBarFrame.size.height
    )
)

यह सिर्फ एक सरल लेकिन बहुत उपयोगी मैक्रो है, बस इसे आज़माएं आपको कोई अतिरिक्त कोड लिखने की आवश्यकता नहीं है

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