17

के साथ अभिविन्यास समर्थित है मेरे पास एक आईफोन ऐप है जिसे मैं आईओएस 6 में अपडेट कर रहा हूं जिसमें घूर्णन के मुद्दे हैं। मेरे पास UITabBarController है जिसमें 16 UINavigationCotrollers है। अधिकांश सबव्यूज़ पोर्ट्रेट या लैंडस्केप में काम कर सकते हैं लेकिन उनमें से कुछ केवल पोर्ट्रेट हैं। आईओएस 6 चीजें घूर्णन कर रही हैं जब उन्हें नहीं करना चाहिए।आईओएस 6 UITabBarController वर्तमान UINavigation नियंत्रक

मैं TabBarController उपवर्गीकरण वर्तमान navigationController के लिए चुनी गई ViewController की supportedInterfaceOrienations वापसी करने की कोशिश की:

- (NSUInteger)supportedInterfaceOrientations{ 

    UINavigationController *navController = (UINavigationController *)self.selectedViewController; 
    return [navController.visibleViewController supportedInterfaceOrientations]; 
} 

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

आदर्श रूप से ऐप केवल वर्तमान दृश्य दृश्य नियंत्रक के समर्थित उन्मूलन में होगा। कोई विचार?

उत्तर

58

उपवर्ग अपने UITabBarController अधिभावी इन तरीकों:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // You do not need this method if you are not supporting earlier iOS Versions 
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [self.selectedViewController supportedInterfaceOrientations]; 
} 

-(BOOL)shouldAutorotate 
{ 
    return YES; 
} 

उपवर्ग अपने UINavigationController अधिभावी इन तरीकों:

:

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [self.topViewController supportedInterfaceOrientations]; 
} 

-(BOOL)shouldAutorotate 
{ 
    return YES; 
} 

फिर अपने viewControllers में इन विधियों है कि आप को घुमाने के लिए नहीं करना चाहती लागू

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

-(BOOL)shouldAutorotate 
{ 
    return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

और viewControllers है कि आप बारी बारी से करना चाहते हैं के लिए:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 
     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
    } 

    -(NSUInteger)supportedInterfaceOrientations 
    { 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 

    -(BOOL)shouldAutorotate 
    { 
     return YES; 
    } 

आपका TabBarController ऐप्लिकेशन विंडो की RootviewController के रूप में जोड़ा जाना चाहिए। यदि आप डिफ़ॉल्ट ओरिएंटेशन का समर्थन करने की योजना बना रहे हैं, तो आईफोन के लिए सब कुछ अपरिवर्तनीय है, तो आपको कुछ और करने की आवश्यकता नहीं है। यदि आप उल्टा समर्थन करना चाहते हैं या यदि आप किसी अन्य उन्मुखता का समर्थन नहीं करना चाहते हैं, तो आपको ऐप प्रतिनिधि और/या info.plist में उचित मान सेट करने की आवश्यकता है।

+7

यह लगभग मेरे लिए काम कर रहा है। समस्या यह है कि अगर मैं पहले से ही परिदृश्य में हूं, जब मैं एक पोर्ट ऑनल व्यू में टैब स्विच करता हूं तो यह अभी भी परिदृश्य में है। घूर्णन पोर्ट्रेट इसे ठीक करता है और यह परिदृश्य पर वापस घूमता नहीं है, लेकिन जब भी यह पहली बार लोड होता है तब भी मुझे पोर्ट्रेट में होना चाहिए। – Ryan

+0

मुझे यकीन नहीं है कि आपको इसे घुमाने के लिए वास्तव में क्या करना है, लेकिन मैं शर्त लगाता हूं कि आप इसे करते हैं - (शून्य) viewWillLayoutSubviews। मैं स्मृति से उस विधि नाम पर बिल्कुल सही नहीं हो सकता है। मेरे अपने विचार, जहां मैंने इस कोड का उपयोग किया, घुमाए जाने पर पूरी तरह से बदल रहे हैं और मैं उन्हें उस विधि का उपयोग पोर्ट्रेट मोड में पुन: कॉन्फ़िगर करने के लिए करता हूं। आप कुछ भी कोशिश कर सकते हैं -दृश्य WillDisappear। शायद [self.view setNeedsDisplay]। मैं फिलहाल एक्सकोड में नहीं हूं इसलिए ये केवल विचार हैं जो मैं आपके मामले में खोजूंगा। –

+0

अच्छा! एक जादू की तरह काम करता है! – Dennso

5

मुझे यह मुद्दा था कि नेविगेशन स्टैक में कुछ व्यू कंट्रोलर सभी ओरिएंटेशन का समर्थन करते हैं, कुछ पोर्ट्रेट, लेकिन UINavigationController सभी ऐप समर्थित ओरिएंटेशन लौट रहा था, इस छोटे से हैक ने मेरी मदद की। मुझे यकीन है कि अगर यह व्यवहार या क्या

@implementation UINavigationController (iOS6OrientationFix) 

-(NSUInteger) supportedInterfaceOrientations { 
    return [self.topViewController supportedInterfaceOrientations]; 
} 

@end 
+0

स्वीकार नहीं कर सकते मैं नहीं समझें कि कैसे हैक ने आपको एक नेविगेशन नियंत्रक के विभिन्न विचार नियंत्रकों पर अलग-अलग व्यवहार करने में मदद की। जैसा कि मुझे पता है कि यह हैक केवल एक बार निष्पादित किया जाएगा, इसलिए सभी देखें नियंत्रक के पास शीर्ष दृश्य नियंत्रक की तुलना में एक ही रोटेशन व्यवहार होगा। क्या मुझे कुछ याद आ रहा है हिंग?? –

+1

यह कोड हर बार डिवाइस बदलते उन्मुखीकरण को निष्पादित किया जाता है, इसलिए यह समर्थित उन्मुखताएं लौटाएगा जिसके लिए कभी भी uiviewcontroller वर्तमान में सक्रिय है और – Mindaugas

+0

पर यह दृश्यमान है। धन्यवाद –

3

मुझे लगता है कि जैसे बेहतर कुछ (एक वर्ग पद्धति के रूप में) है इरादा है नहीं कर रहा हूँ

-(NSUInteger) supportedInterfaceOrientations { 
    if([self.topViewController respondsToSelector:@selector(supportedInterfaceOrientations)]) 
    { 
     return [self.topViewController supportedInterfaceOrientations]; 
    } 
    return UIInterfaceOrientationMaskPortrait; 
} 

यह सुनिश्चित करता है कि विधि कार्यान्वित किया जाता है। यदि आप यह चेक नहीं कर रहे हैं और विधि लागू नहीं की गई है (जैसे आईओएस 5 एनवी में) ऐप को क्रैश करना चाहिए!

0

यदि आप सभी दृश्य नियंत्रकों के लिए रोटेशन को सक्षम या अक्षम करने की योजना बनाते हैं तो आपको UINavigationController उपclass करने की आवश्यकता नहीं है। इसके बजाय का उपयोग करें:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

अपने AppDelegate में।

आप अपने माता पिता दृश्य नियंत्रक में निम्न विधियों के साथ संयोजन में AppDelegate से

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

का उपयोग करना चाहिए आप मूल दस्तावेज़ देख नियंत्रकों पर आपके ऐप की पूरी झुकाव लेकिन अलग झुकाव (उदाहरण के लिए UINavigationController ढेर) का समर्थन करना चाहते हैं ।

- (BOOL)shouldAutorotate 

और

- (NSUInteger)supportedInterfaceOrientations 

लेकिन आप एक ही नेविगेशन ढेर में विभिन्न बच्चों ViewControllers में विभिन्न उन्मुखीकरण सेटिंग है की योजना (मेरे जैसे) यदि आप नेविगेशन ढेर में वर्तमान ViewController जाँच करने के लिए की जरूरत है।

मैं अपने UINavigationController उपवर्ग में निम्नलिखित बना लिया है:

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    int interfaceOrientation = 0; 

    if (self.viewControllers.count > 0) 
    { 
     DLog(@"%@", self.viewControllers); 
     for (id viewController in self.viewControllers) 
     { 
      if ([viewController isKindOfClass:([InitialUseViewController class])]) 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
      } 
      else if ([viewController isKindOfClass:([MainViewController class])]) 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
      } 
      else 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown; 
      } 
     } 
    } 
    return interfaceOrientation; 
} 

जब से तुम बच्चों ViewControllers प्रस्तुत दृश्य नियंत्रक आप किसी भी तरह क्या दृश्य नियंत्रक वर्तमान में नेविगेशन स्टैक में है अवरोधन चाहिए की रोटेशन सेटिंग से अब और नियंत्रित नहीं कर सकते । तो मैंने यही किया :)। उम्मीद है की वो मदद करदे !

संबंधित मुद्दे