IOS 7 में मेरे दृश्य की सीमा पर स्थिति पट्टी और नेविगेशन बार दिखाई देते हैं


435

मैंने हाल ही में iOS 7 में अपने ऐप्स का परीक्षण करने के लिए Xcode 5 DP डाउनलोड किया है । सबसे पहली बात जो मैंने देखी और पक्की है, वह यह है कि मेरे विचार की सीमा हमेशा स्टेटस बार और नेविगेशन बार को ध्यान में रखते हुए नहीं बनाई जाती है।

में viewDidLayoutSubviews, मैं दृश्य की सीमाएँ प्रिंट करता हूं:

{{0, 0}, {320, 568}}

इससे मेरा कंटेंट नेविगेशन बार और स्टेटस बार के नीचे दिखाई देता है।

मुझे पता है कि मैं मुख्य स्क्रीन की ऊँचाई प्राप्त करके, स्थिति बार की ऊँचाई और नेविगेशन बार की ऊँचाई को घटाकर ऊँचाई का हिसाब रख सकता हूँ, लेकिन यह अनावश्यक अतिरिक्त काम की तरह लगता है।

मैं इस समस्या को कैसे हल कर सकता हूं?

अपडेट करें:

मुझे इस विशिष्ट समस्या का हल मिल गया है। नेविगेशन बार की पारभासी संपत्ति को NO पर सेट करें:

self.navigationController.navigationBar.translucent = NO;

यह नेविगेशन बार और स्टेटस बार के नीचे फंसाए जाने से दृश्य को ठीक करेगा।

हालाँकि, मुझे उस मामले के लिए कोई फिक्स नहीं मिला है जब आप चाहते हैं कि नेविगेशन बार पारभासी हो। उदाहरण के लिए, एक तस्वीर को पूर्ण स्क्रीन पर देखने के बाद, मैं चाहता हूं कि नेविगेशन बार पारभासी हो, और इसके नीचे फ्रेम किए जाने का दृश्य। यह काम करता है, लेकिन जब मैं नेविगेशन बार को दिखा / छुपाता हूं, तो मुझे अजनबी परिणाम भी अनुभव होते हैं। पहला सबव्यू (एक UIScrollView) हर बार अपनी सीमा y मूल को बदल देता है।


मुझे xcode 5 DP में भी यही मुद्दा मिल रहा है
गोपेश गुप्ता

मुझे बताएं कि क्या आपको कुछ समाधान मिलेगा
गोपेश गुप्ता

1
एक टिंट रंग संपत्ति के लिए नेविगेशन बार में देखें, आपको जो भी चाहिए, उस नीले रंग को बदलने में सक्षम होना चाहिए।
मधुमक्खी पालन

9
मुझे आईओएस अपग्रेड से कभी-कभी नफरत है क्योंकि ऐप्पल ने आपको अपने ऐप को पीछे की ओर रखने का मौका नहीं दिया।
Bagusflyer

3
यदि समस्या नेविगेशन कंट्रोलर टॉप बार को छिपाने के बाद स्टेटस बार के अंतर्गत आने वाले दृश्य से संबंधित है, तो मैं समाधान के रूप में @Stunner stackoverflow.com/a/18976660/235206 द्वारा उत्तर का उल्लेख करूँगा
MiKL

जवाबों:


495

आप edgesForExtendedLayoutiOS7 एसडीके में एक नई संपत्ति को लागू करके इसे प्राप्त कर सकते हैं । इसे प्राप्त करने के लिए कृपया निम्नलिखित कोड जोड़ें,

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

आपको अपनी -(void)viewDidLoadविधि में उपरोक्त जोड़ने की आवश्यकता है ।

IOS 7 आपके यूआई के स्वरूप को लेआउट और कस्टमाइज़ करने के तरीके में कई बदलाव लाता है । व्यू-कंट्रोलर लेआउट, टिंट रंग और फ़ॉन्ट में परिवर्तन आपके ऐप में मौजूद सभी UIKit ऑब्जेक्ट्स को प्रभावित करते हैं। इसके अलावा, जेस्चर पहचानकर्ता एपीआई में वृद्धि आपको इशारों की बातचीत पर बेहतर नियंत्रण प्रदान करती है।

व्यू कंट्रोलर्स का उपयोग करना

IOS 7 में, व्यू कंट्रोलर फुल-स्क्रीन लेआउट का उपयोग करते हैं। उसी समय, iOS 7 आपको एक व्यू कंट्रोलर द्वारा अपने विचारों को देखने के तरीके पर अधिक नियंत्रण प्रदान करता है। विशेष रूप से, फ़ुल-स्क्रीन लेआउट की अवधारणा को परिष्कृत किया गया है ताकि किसी व्यू कंट्रोलर को उसके दृश्य के प्रत्येक किनारे के लेआउट को निर्दिष्ट किया जा सके।

wantsFullScreenLayoutदृश्य नियंत्रक संपत्ति आईओएस 7 में हटा दिया गया है आप वर्तमान में निर्दिष्ट करते हैं wantsFullScreenLayout = NOजब यह आईओएस 7 में चलता है, दृश्य नियंत्रक एक अप्रत्याशित स्क्रीन स्थान पर अपनी सामग्री प्रदर्शित कर सकता है।

यह देखने के लिए कि कोई नियंत्रक अपने विचारों को कैसे देता है, इसे समायोजित करने के लिए, UIViewController निम्नलिखित गुण प्रदान करता है:

  • edgesForExtendedLayout

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

  • extendedLayoutIncludesOpaqueBars

यदि आपका डिज़ाइन अपारदर्शी सलाखों का उपयोग करता है, edgesForExtendedLayoutतो extendedLayoutIncludesOpaqueBarsसंपत्ति को NO पर सेट करके भी परिष्कृत करें । (का डिफ़ॉल्ट मान extendedLayoutIncludesOpaqueBarsहै सं ।)

  • automaticallyAdjustsScrollViewInsets

यदि आप नहीं चाहते कि स्क्रॉल दृश्य की सामग्री इनसेट स्वचालित रूप से समायोजित हो, तो NO पर सेट automaticallyAdjustsScrollViewInsetsकरें । (का डिफ़ॉल्ट मान है हाँ ।)automaticallyAdjustsScrollViewInsets

  • topLayoutGuide, bottomLayoutGuide

topLayoutGuideऔर bottomLayoutGuideगुण के लिए एक दृश्य नियंत्रक के दृश्य में ऊपर या नीचे पट्टी किनारों के स्थान का संकेत। यदि बार को किसी दृश्य के ऊपर या नीचे ओवरलैप करना चाहिए, तो आप इंटरफ़ेस बिल्डर का उपयोग करके बार के सापेक्ष अवरोधों को नीचे topLayoutGuideया उसके निचले हिस्से के ऊपरी हिस्से तक ले जा सकते हैं। (यदि कोई बार दृश्य को ओवरलैप नहीं करना चाहिए, तो नीचे का भाग दृश्य topLayoutGuideके शीर्ष के समान है और शीर्ष का दृश्य bottomLayoutGuideके तल के समान ही है।) अनुरोध किए जाने पर दोनों गुण आलस्य से बनाए जाते हैं।

कृपया देखें, सेब डॉक


2
यह iOS6 के तहत संकलन नहीं करेगा। मुझे लगता है कि इसे प्रदर्शनकर्ता के रूप में लिखा जाना चाहिए ...
श्मिट

8
हाँ, यही कारण है कि मैं के साथ चयनकर्ता जांच को शामिल किया है अगर हालत, अगर ([आत्म respondsToSelector: @selector (edgesForExtendedLayout)])
नंदा

19
अगर मेरे पास कोई नेविगेशन बार नहीं है तो यह काम नहीं करेगा। उस स्थिति में, मेरा विचार स्टेटस बार के पीछे फैला हुआ है ..
वैन डू ट्रान

4
मुझे @VanDuTran जैसी ही समस्या है। यदि नेविगेशन बार छिपा हुआ है, तो किनारों को हटाने में मदद नहीं करता है।
मछली पालन

6
यह काम करता है लेकिन ... अब पारभासी प्रभाव नहीं है ... हम पारभासी प्रभाव को कैसे संरक्षित कर सकते हैं ...
दीपू राजक

110

आपको यह गणना करने की आवश्यकता नहीं है कि सब कुछ नीचे स्थानांतरित करने के लिए, इसके लिए एक संपत्ति है। इंटरफ़ेस बिल्डर में, अपने दृश्य नियंत्रक को हाइलाइट करें, और फिर गुण निरीक्षक पर नेविगेट करें। यहां आपको "विस्तार किनारों" शब्दों के बगल में कुछ चेक बॉक्स दिखाई देंगे। जैसा कि आप देख सकते हैं, पहले स्क्रीनशॉट में, डिफ़ॉल्ट चयन सामग्री के लिए शीर्ष और नीचे की सलाखों के नीचे दिखाई देने के लिए है, लेकिन अपारदर्शी सलाखों के नीचे नहीं, यही वजह है कि बार शैली को पारभासी नहीं करने के लिए आपके लिए काम कर रहा है।

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

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

यह दूसरा स्क्रीनशॉट दिखाता है कि "अंडर टॉप बार्स" चेक बॉक्स को अचयनित करने पर क्या होता है। जैसा कि आप देख सकते हैं, नेविगेशन बार के ठीक नीचे इसकी y उत्पत्ति के लिए व्यू कंट्रोलर्स व्यू को उचित रूप से स्थानांतरित कर दिया गया है।

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

यह भी उपयोग के माध्यम से प्रोग्रामेटिक रूप से पूरा किया जा सकता है -[UIViewController edgesForExtendedLayout]। यहां किनारे के संदर्भ के लिए वर्ग संदर्भ का लिंक दिया गया है और UIRectEdge के लिए

[self setEdgesForExtendedLayout:UIRectEdgeNone];

15
मैं केवल एक .xib में देखने के लिए एक ही कैसे करूँ?
बोबिक्स

2
मैंने देखने के लिए एक लेबल जोड़ा और मैंने आपके निर्देश का पालन किया लेकिन यह मेरे लिए काम नहीं कर रहा है
RMRAHUL

5
@bobics XIB प्रश्न का उत्तर है, "आप नहीं कर सकते।" वैसे भी आईबी के माध्यम से नहीं। एक रडार दर्ज करें और आशा है कि Apple अंततः इसे संबोधित करेगा।
मेमों

धन्यवाद @ 0x7fffffff, यह सिर्फ वह जानकारी थी जिसकी मुझे तलाश थी और बहुत मददगार थी।
कैंपो

33

मैंने अपना विचार कार्यक्रमबद्ध रूप से बनाया और यह मेरे लिए काम कर रहा है:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

स्रोत ( पृष्ठ के निचले भाग में topLayoutGuide अनुभाग)।


अंत में एक उत्तर मिला जो वास्तव में इसके लिए काम करता है। अच्छा कार्य!
स्टुअर्टम

1
इस समस्या को हल करने के लिए जहां नेविगेशन बार के छिपे होने पर व्यू कंट्रोलर का व्यू स्टेटस बार के नीचे दिखाई देता है, यह वह कोड होता है जो स्टेटस बार के तहत व्यू को स्नैप करता है।
MiKL

नोट: यह आपके दृश्य को स्क्रीन से नीचे धकेल देगा।
मेमों

1
इसके अलावा, जब तक आप केवल iOS7 के लिए निर्माण नहीं कर रहे हैं , उपरोक्त कोड एक त्रुटि फेंक देगा - topLayoutGuideकेवल iOS7 है।
मेमन

1
यह भी ध्यान दें कि जब आपका मुख्य दृश्य UITableView है, तो viewDidLayoutSubviews प्रत्येक स्क्रॉल पर कॉल करेगा। जब तक इसकी ऊंचाई 15px नहीं होगी, तब तक आपका यूआईटेबल व्यू नीचे दिया जाएगा। केवल एक बार इस कोड को चलाने के लिए एक ध्वज जोड़ें। ;)
थॉमस

30

स्विफ्ट 3 / स्विफ्ट 4 समाधान जो iOS 10+ में NIB / XIB फ़ाइलों के साथ भी काम करता है:

override func viewDidLoad() {
    super.viewDidLoad()

    edgesForExtendedLayout = []
}

यह वही है जिसने मेरी मदद की ... सो सिंपल। धन्यवाद :-)
हरनान आर्बर

धन्यवाद, यह वास्तव में मददगार है
मुहम्मद अहमद बेग

10.x स्विफ्ट 3+ IMO के लिए यह सबसे अच्छा उपाय है
shokaveli

10

यदि आप चाहते हैं कि ट्रांसल्यूसेंट नेव बार (जो एक तरह का अच्छा हो) के लिए आपको एक कंटेंट सेट करना है या इसी तरह का।

यहाँ है कि मैं यह कैसे करते हैं:

// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
      CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
      float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;

      myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}

3
आप सीधे 7.0 से इसकी तुलना क्यों नहीं कर सकते
लीना सेप

1
योग्य मुझे यह मिल गया है: नाबालिग जोड़ा के साथ एक विशिष्ट संस्करण के खिलाफ जांच कम मजबूत है। लेकिन आप जाँच रहे हैं कि मान BIGGER है या 7.0 की तुलना में बराबर है तो यहाँ ठीक होगा?)
EeKay

1
@ एलिना - यह 7.x और बाद की विशेषताओं में है - इसलिए मैं जांचता हूं कि क्या संस्करण 7 या अधिक है और चेक में मामूली संशोधन छोड़ दें।
मैग्नस

2
मेरे पास मेरा टेबल व्यू मधुमक्खी के साथ एक मुद्दा था जो मेरे तब्बार के पीछे दिखाई देता था। जिसने मेरी तालिका की अंतिम पंक्ति को कभी भी टैबर के ऊपर स्क्रॉल नहीं किया। मैंने इसे इस तरह तय किया: myTableView.contentInset = UIEdgeInsetsMake (0, 0.0, टैबरहाइट, 0)
जेम्स लॉरेनस्टिन

contentInsetकी संपत्ति है UIScrollView। क्या होगा अगर मेरा मुख्य दृश्य एक उपवर्ग नहीं है UIScrollView। फिर मैं ओवरलैप समस्या को कैसे ठीक करूंगा?
Pwner

9

edgesForExtendedLayoutiOS 7 के लिए ट्रिक करता है। हालाँकि, यदि आप iOS 7 SDK में ऐप बनाते हैं और इसे iOS 6 में तैनात करते हैं, तो नेविगेशन बार पारभासी दिखाई देता है और इसके नीचे व्यू चलते हैं। इसलिए, इसे iOS 7 और साथ ही iOS 6 के लिए ठीक करने के लिए ऐसा करें:

self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

9

आपके एप्लिकेशन में plist फ़ाइल एक पंक्ति जोड़ती है, इसे "नियंत्रक-आधारित स्थिति बार उपस्थिति देखें" और इसे NO पर सेट करें ।


7

सबसे सरल ट्रिक है NIB फाइल को खोलना और इन दो सरल चरणों को करना:

  1. बस इसे टॉगल करें और इसे अपनी पसंद के अनुसार सेट करें:

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

  1. उन UIView / UIIMageView / ... का चयन करें जिन्हें आप नीचे ले जाना चाहते हैं। मेरे मामले में केवल लोगो को ओवरलैप किया गया था, मैंने डेल्टा को +15 पर सेट किया है; (OR15 यदि आपने चरण 1 में iOS 7 चुना है)

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

और परिणाम :

इससे पहले उपरांत


6
यह काम करता है, लेकिन यह समाधान बनाए रखने के लिए एक कठिन जैसा दिखता है। इसे पैच करने के बजाय समस्या को ठीक करना सबसे अच्छा होगा।
NLemay

यह सब दृश्य के साक्षात्कार के लिए प्रोग्रामेटिक रूप से करना सबसे अच्छा होगा क्योंकि यह मुख्य दृश्य पर लागू होने पर काम नहीं करता है
वाइल्डमॉन्की

5

स्विफ्ट समाधान:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.edgesForExtendedLayout = UIRectEdge.None
}

4
यह अब किनारों पर है। एक्सटेंडेड लैयआउट = []
लियोन

1
चूंकि यह एक सार्वजनिक जवाब है जिसे हमें कॉल करना नहीं भूलना चाहिए:super.viewWillAppear(animated)
prodos

4

मैं स्टनर के जवाब पर विस्तार करना चाहूंगा, और एक जोड़ूंगा if यह जांचने के बयान कि क्या यह आईओएस -7 है, क्योंकि जब मैंने आईओएस 6 पर इसका परीक्षण किया तो मेरा ऐप क्रैश हो जाएगा।

जोड़ जोड़ दिया जाएगा:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

इसलिए मैं इस विधि को आपकी MyViewControler.mफ़ाइल में जोड़ने का सुझाव दूंगा :

- (void) viewDidLayoutSubviews {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
    }
}


3

मेरे पास एक परिदृश्य है जहां मैं अपने विज्ञापनों को प्रदर्शित करने के लिए Apple द्वारा लिखित BannerViewController और BannerViewController में एम्बेडेड एक स्क्रॉल दृश्य नियंत्रक का उपयोग करता हूं।

नेविगेशन बार को अपनी सामग्री को छिपाने से रोकने के लिए, मुझे दो बदलाव करने होंगे।

1) BannerViewController.m संशोधित करें

- (void)viewDidLoad
{
   [super viewDidLoad];
   float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
   if (systemVersion >= 7.0) {
      self.edgesForExtendedLayout = UIRectEdgeNone;
   }
}

2) मेरी स्क्रॉल व्यू कॉन्टोलर को संशोधित करें

- (void)viewDidLoad
{
    [super viewDidLoad];
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0) {
        self.edgesForExtendedLayout = UIRectEdgeBottom;
    }
}

अब विज्ञापन नेविगेशन बार द्वारा कवर किए जाने के बजाय दृश्य के निचले भाग में सही तरीके से दिखाई देते हैं और शीर्ष पर मौजूद सामग्री को नहीं काटा जाता है।


2

बस निम्नलिखित कोड सेट करें दृश्य में दिखाई देगा।

  if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
 }

यह केवल एक चीज है जो मेरी परिस्थिति में काम करती है।
गोबलीता


2

स्विफ्ट 4.2 - Xcode 10.0 - iOS 12.0:

if #available(iOS 11.0, *) {} else {
  self.edgesForExtendedLayout = []
  self.navigationController?.view.backgroundColor = .white
}

1

मेरे लिए, सरलतम उपाय यह है कि प्लिस्ट में दो कुंजियाँ जोड़ी जाएँ

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


+1, मेरे पास "स्टेटस बार शुरू में छिपा हुआ" = YES था, लेकिन "कंट्रोलर-आधारित स्टेटस बार उपस्थिति" = NO जोड़ते समय = नो मुझे स्टेटस बार से छुटकारा मिल गया।
जोनास बिस्ट्रॉम

1

ड्रॉपडाउनलिस्ट से पंक्ति के रूप में कुंजी "नियंत्रक-आधारित स्थिति बार उपस्थिति" जोड़ें info.plist। कुछ इस तरह:

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


interesting.it ने मेरी cocos2d परियोजनाओं पर मदद की। इस विकल्प को चालू करने के लिए मैं देख सकता हूं कि शीर्ष स्थिति पट्टी पूरी तरह से चली गई है या दिखाई दे रही है।
कुर्सात तुर्क

1

आईपैड्स (armv7, armv7s, am64) द्वारा मेरे ऐप के साथ एक ही मुद्दा था, केवल एक और UIViewController पेश करके और उन्हें खारिज करने के बाद स्टेटस बार के तहत नेवी बार ... मैं उस पर कोई समाधान खोजने के लिए बहुत समय बिताता हूं। मैं स्टोरीबोर्ड का उपयोग कर रहा हूं और UIViewController के लिए InterfaceBuilder में जो FullScreen -> वर्तमान संदर्भ से प्रस्तुति को भयानक बनाता है और यह इस समस्या को ठीक करता है। यह मेरे ऐप में केवल iPads => iOS8.0 (iOS8.1 के साथ परीक्षण) और iOS 7.1 के साथ आईपैड के लिए काम नहीं करता है !!स्क्रीनशॉट देखें


मेरे मामले में, मेरा मुख्य दृश्य मेरे टैब को ओवरलैप कर रहा था और मेरे पास कोई विचार नहीं था। यह विस्तार किनारों> अंडर बार्ड बार्स को चेक किया गया। यह नोटिस करना वास्तव में कठिन था क्योंकि मेरे ऐप की पृष्ठभूमि सफेद थी और इसने मेरे टैबबार पर कुछ स्तर की अस्पष्टता उत्पन्न की। धन्यवाद!
यीशु रोड्रिगेज

0

IOS 7 में स्टेटस बार छिपाने के लिए चरण:

1. अपने आवेदन info.plist फ़ाइल के लिए जाओ।

2.और सेट, देखें नियंत्रक-आधारित स्थिति बार उपस्थिति: बूलियन सं

आशा है कि मैंने स्टेटस बार के मुद्दे को हल कर दिया है .....


0

मेरे मामले में loadView () ने
इस कोड को बाधित किया: self.edgesForExtendedLayout = UIRectEdgeNone

लेकिन loadView () हटाने के बाद सब कुछ ठीक हो गया

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