iOS 7 - स्टेटस बार दृश्य को ओवरलैप करता है


109

मेरे पास एक है ViewControllerजो अंदर है UINavigationcontroller, लेकिन नेविगेशनबार छिपा हुआ है। जब मैं ऐप को iOS 7 पर चलाता हूं, तो स्टेटस बार मेरे विचार के शीर्ष पर दिखाई देता है। इससे बचने का कोई रास्ता है क्या?

मैं कोई OS विशिष्ट कोड नहीं लिखना चाहता।

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

मैंने सेटिंग View controller-based status bar appearanceकरने की कोशिश की NO, लेकिन इसने समस्या को ठीक नहीं किया।


मैंने iOS 6 में iOS 6 की तरह स्टेटस बार दिखाने के लिए अपना जवाब पोस्ट किया है। stackoverflow.com/questions/18294872/…
डेजर्ट रोज

2
आपको y मूल और डेल्टा मान को समायोजित करने की आवश्यकता है और साथ ही स्थिति पट्टी समस्या को संभालने के लिए यह आपकी मदद कर सकता है stackoverflow.com/q/18980925/1545180
गणपति

जवाबों:


95

Xcode 5 में iOS 6/7 Deltasविशेष रूप से इस मुद्दे को हल करने के लिए बनाया गया है। स्टोरीबोर्ड में, मैंने iOS 7 पर सही दिखने के लिए अपने विचारों को 20 पिक्सेल नीचे ले जाया और इसे iOS 6 संगत बनाने के लिए, मैं बदलकर Delta y-20 हो गया।

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

चूंकि मेरे स्टोरीबोर्ड ऑटो लेआउट का उपयोग नहीं है, आदेश पर iOS 6 मैं ठीक से देखे जाने की ऊंचाई आकार बदलने के लिए में स्थापित करने के लिए किया था Delta heightऔर साथ ही Delta Y


8
आपका उत्तर सही है लेकिन 4 "डिस्प्ले के साथ काम नहीं करता है। कृपया अपने उत्तर को अपडेट करें यदि आप इसे 4" डिस्प्ले के लिए भी काम कर सकते हैं। अग्रिम में धन्यवाद।

2
@AnkitMehta मुझे 4 "iphones के लिए कुछ खास करने की ज़रूरत नहीं थी
aryaxt

5
मेरे लिए काम किया। ध्यान दें कि इस डेल्टास को देखने के लिए, आपको स्टोरीबोर्ड के लिए 'आइडेंटिटी एंड टाइप' के तहत 'यूज ऑटोलेयआउट' को अचयनित करना होगा।
मंगल 12

2
मुझे foundY के लिए -20 सेट करने के अलावा पता चला, मुझे also हाइट के लिए +20 भी सेट करना पड़ा
होन

3
क्या होता है जब स्थिति की ऊंचाई बदल जाएगी? F.ex .: जब उपयोगकर्ता गर्म स्थान को सक्रिय करता है, आदि .... तो ऊंचाई 40px है ...
लुकाज़

69

यदि आप बस किसी भी स्टेटस बार को नहीं चाहते हैं, तो आपको अपने डेटा को इस डेटा के साथ अपडेट करना होगा: ऐसा करने के लिए, प्लिस्ट में, उन 2 सेटिंग्स को जोड़ें:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

IOS 7 में आपको अपने ऐप को ओवरलैड ट्रांसपेरेंट स्टेटस बार को ध्यान में रखकर डिजाइन करने की उम्मीद है। उदाहरण के लिए नया iOS 7 वेदर ऐप देखें।


3
यह वास्तव में एकमात्र अच्छा जवाब है क्योंकि यह मुद्दे को उसके मूल में ठीक करता है जिस तरह से यह किया जाना था। तो: upvotes की जरूरत है!
ग्यारहवें

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

1
@ ग्यारह, आप का मतलब है जिस तरह से Apple में autocrats इरादा है।
जॉनके ऑक्ट

1
निश्चित रूप से यह एक दृश्य नियंत्रक की ऑफसेट को बदलने से बेहतर है (जो वास्तव में गंदा लगता है)।
बेंजामिन ओमान

स्टेटस बार छुपाना एक अच्छा विचार नहीं है ... मुझे पता है कि आईओएस 7 को संभालने का यह सबसे आसान तरीका है, लेकिन समय की आवश्यकता है ...
फहीम पारकर

43

यह UIViewControlleriOS 7 के लिए डिफ़ॉल्ट व्यवहार है । दृश्य पूर्ण-स्क्रीन होगा जिसका अर्थ है कि स्थिति पट्टी आपके दृश्य के शीर्ष को कवर करेगी।

यदि आपके पास एक UIViewControllerहै UINavigationControllerऔर नेविगेशनबार दिखाई देता है, तो आपके पास निम्नलिखित कोड हो सकते हैं viewDidLoadया नेविगेशन पृष्ठभूमि के लिए पृष्ठभूमि छवि हो सकती है।

self.edgesForExtendedLayout = UIRectEdgeNone;

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

यहाँ iOS संस्करण का पता लगाने के लिए नमूना कोड दिया गया है, यदि आप बैकवर्ड संगतता चाहते हैं।

NSUInteger DeviceSystemMajorVersion() {
    static NSUInteger _deviceSystemMajorVersion = -1;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        NSString *systemVersion = [UIDevice currentDevice].systemVersion;
        _deviceSystemMajorVersion = [[systemVersion componentsSeparatedByString:@"."][0] intValue];
    });

   return _deviceSystemMajorVersion;
}

18
सिस्टम संस्करण को लाने, पार्स करने और उसकी तुलना करने के बजाय, इसका उपयोग करने की सिफारिश की जाती हैif ([self respondsToSelector:@selector(edgesForExtendedLayout)])
सेबस्टियन होजस

15

केवल काम कर समाधान मैं अपने स्वयं के द्वारा किया है।

यहाँ मेरा UIViewController उपवर्ग https://github.com/comonitos/ios7_overlaping है

1 UIViewController से उपवर्ग

2 उस वर्ग से अपनी window.rootViewController उप-वर्ग।

3 वोइला!

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect screen = [[UIScreen mainScreen] bounds];
        if (self.navigationController) {
            CGRect frame = self.navigationController.view.frame;
            frame.origin.y = 20;
            frame.size.height = screen.size.height - 20;
            self.navigationController.view.frame = frame;
        } else {
            if ([self respondsToSelector: @selector(containerView)]) {
                UIView *containerView = (UIView *)[self performSelector: @selector(containerView)];

                CGRect frame = containerView.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                containerView.frame = frame;
            } else {
                CGRect frame = self.view.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                self.view.frame = frame;
            }
        }
    }
}

4 अपने स्टेटस बार को सफ़ेद बनाने के लिए इसे जोड़ें [Self.window makeKeyAndVouble] के ठीक बाद; !!!

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

लेकिन यह शीर्ष पर समय नहीं दिखा रहा है ... सबसे बड़ा नुकसान ...:
फहीम पारकर

महान काम करता है, लेकिन चरण 4 के लिए आपको अपने दृश्य नियंत्रक में पसंदीदास्टैटबर्सेल्टी का उपयोग करना चाहिए, क्योंकि सेटस्टैटसबर्सेल्टी को पदावनत किया जाता है और यह कुछ भी नहीं करने के लिए डिफ़ॉल्ट कार्रवाई है। stackoverflow.com/a/19014724/1192732
CpnCrunch 16

13
-(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

-(void)viewWillLayoutSubviews{

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
  {
    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    if(UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
        screenHeight = screenRect.size.height;
    else
        screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, 20, self.view.frame.size.width,screenHeight-20);
    CGRect viewFrame1 = [self.view convertRect:self.view.frame toView:nil];
    if (!CGRectEqualToRect(screenFrame, viewFrame1))
    {
        self.view.frame = screenFrame;
        self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    }
  }
}

Plist में Key जोड़ें --- नियंत्रक-आधारित स्थिति बार उपस्थिति देखें: NO


यदि आवश्यकता हो तो विंडो का रंग बदल दें
Darshit Shah

धन्यवाद, यह मेरी अतिव्यापी समस्या हल हो गई। लेकिन एक मुद्दा अभी भी है - देखें नियंत्रक-आधारित स्थिति बार उपस्थिति: NO स्थिति छिपाना है बार मुझे लगता है। लेकिन जब मैंने इसे YES में सेट किया, तो इसका स्टेटस बार नहीं दिखा और जब मैंने इसे NO पर सेट किया, तो यह स्टेटस बार दिखा रहा है। तो plz मुझे बताओ कि मैं अवधारणा के साथ गलत हूँ या क्या?
नयन

1
मुझे लगता है क्योंकि डिफाइन सेमी ट्रांसपेरेंट कलर सेट डिफाइनल लैंचिंग वाइट ओशन्स में 'self.window.backgroundColor = [UIColor blueColor];' और प्लिस्ट व्यू कंट्रोलर बेस्ड स्टेटस बार उपस्थिति में सेट करें YES
Darshit Shah

अच्छा धन्यवाद! इसके अलावा, केवल यह बताने के लिए कि यदि (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1) {} और {} के साथ जाँच करने पर सेब डॉक्स की सलाह देते हैं। चीयर्स!
जोएल बामर

आपका बहुत-बहुत धन्यवाद। आपका कोड हमारे लिए इतना उपयोगी है। कृपया देखने के बारे में समझाने की जरूरत है। LilloutSubviews फ़ंक्शन।
user3182143

4

Ios7 में स्टेटस बार को छिपाने के लिए इन सरल चरणों का पालन करें:

Xcode गोटो में " Resources" फोल्डर और ओपन " (app name)-Info.plist file"।

  • " View controller based status bar appearance" कुंजी की जांच करें और उसका मान सेट करें " NO"
  • " Status bar is initially hidden" कुंजी की जांच करें और उसका मान सेट करें " YES"

यदि चाबियाँ नहीं हैं, तो आप information property listशीर्ष पर " " का चयन करके जोड़ सकते हैं और + आइकन पर क्लिक कर सकते हैं


प्रश्न को स्पष्ट रूप से पढ़ें, उसने स्टेटस बार को पूरी तरह से छिपाने के लिए नहीं कहा।
शयनक

1
@ स्पेसक्राफ्ट: उन्होंने पूछा "क्या इससे बचने का कोई तरीका है?" और इससे बचने का एक तरीका है।
मंदीप पसबोला

3

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

-(BOOL) prefersStatusBarHidden
{
    return YES;
}

संदर्भ https://stackoverflow.com/a/18873777/1030449


3

यदि xibs का उपयोग कर रहे हैं , तो एक बहुत ही आसान कार्यान्वयन कंटेनर के अंदर के झंडे (जो आप पहले से ही 3.5 "और 4" अनुकूलता के लिए उपयोग कर रहे हैं) के साथ सभी साक्षात्कारों को इनकैप्सुलेट करना है ताकि दृश्य पदानुक्रम कुछ इस तरह दिखे

xib पदानुक्रम

और फिर viewDidLoad, कुछ इस तरह से करें:

- (void)viewDidLoad
{
  [super viewDidLoad];
  // initializations
  if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) // only for iOS 7 and above
  {
    CGRect frame = containerView.frame;
    frame.origin.y += 20;
    frame.size.height -= 20;
    containerView.frame = frame;
  }
}

इस तरह, आईओएस 7 संगतता के लिए निब को संशोधित करने की आवश्यकता नहीं है। यदि आपके पास एक पृष्ठभूमि है, तो इसे बाहर रखा जा सकता है containerViewऔर इसे पूरी स्क्रीन को कवर करने दें।


3

यह स्थिति पट्टी को हटाने के लिए आवश्यक है। यहां छवि विवरण दर्ज करें


2

नेविगेशन बार के लिए:

इस कोड को लिखना:

self.navigationController.navigationBar.translucent = NO;

बस मेरे लिए चाल चली।


1

विन्सेन्ट के जवाब किनारों मेरे लिए काम किया।

ये मैक्रो ओएस संस्करण को आसान बनाने में मदद करते हैं

// 7.0 and above 
#define IS_DEVICE_RUNNING_IOS_7_AND_ABOVE() ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) 

// 6.0, 6.0.x, 6.1, 6.1.x
#define IS_DEVICE_RUNNING_IOS_6_OR_BELOW() ([[[UIDevice currentDevice] systemVersion] compare:@"6.2" options:NSNumericSearch] != NSOrderedDescending) 

इन मैक्रो को अपने प्रोजेक्ट की प्रीफ़िक्स। pch फ़ाइल में जोड़ें और कहीं भी पहुँचा जा सकता है

if(IS_DEVICE_RUNNING_IOS_7_AND_ABOVE())
{
 //some iOS 7 stuff
 self.edgesForExtendedLayout = UIRectEdgeNone;
}

if(IS_DEVICE_RUNNING_IOS_6_OR_BELOW())
{
 // some old iOS stuff
}

1
मेरे लिए self.edgesForExtendedLayout = UIRectEdgeNone; काम नहीं कर रहा है ... किसी भी कारण से?
फहीम पारकर

1

मैंने इस प्रश्न के साथ एक और पोस्ट के साथ अपना उत्तर पोस्ट किया है।

Apple iOS7 संक्रमण गाइड से, https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/usoc/uid/TP40013174-CH15-SW1

विशेष रूप से automaticallyAdjustsScrollViewInsets=YESऔर set self.edgesForExtendedLayout = UIRectEdgeNoneमेरे लिए काम करता है जब मैं ओवरलैप नहीं करना चाहता और मेरे पास ए tableviewcontroller


0

यदि आप चाहते हैं कि "ऑटोलॉययूट का उपयोग करें" को किसी भी कीमत पर सक्षम किया जाए तो निम्नलिखित कोड को व्यूडलोड में रखें।

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
{
        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.extendedLayoutIncludesOpaqueBars = NO;
        self.automaticallyAdjustsScrollViewInsets = NO;
}

0

YTPlayer के परिदृश्य दृश्य से लौटने के बाद मेरी स्थिति पट्टी और नेविगेशन बार ओवरलैप। यहाँ @comonitos के संस्करण को आज़माने के बाद मेरा समाधान है, लेकिन मेरे iOS 8 पर काम नहीं कर रहा है

- (void)fixNavigationBarPosition {
    if (self.navigationController) {
        CGRect frame = self.navigationController.navigationBar.frame;
        if (frame.origin.y != 20.f) {
            frame.origin.y = 20.f;
            self.navigationController.navigationBar.frame = frame;
        }
    }
}

जब भी आप नेविगेशन बार की स्थिति को ठीक करना चाहते हैं तो बस इस फ़ंक्शन को कॉल करें। मैंने YTPlayerViewDelegate पर कॉल कियाplayerView:didChangeToState:

- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state {
    switch (state) {
        case kYTPlayerStatePaused:
        case kYTPlayerStateEnded:
            [self fixNavigationBarPosition];
            break;
        default:
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.