ios - आईओएस 6 रोटेशन: समर्थितइंटरफेस ऑर्गनाइजेशन काम नहीं करता है?




rotation ios6 (6)

@ स्विफ्ट 4 के लिए अल्विवी का जवाब अपडेट।

extension UINavigationController {

    // Look for the supportedInterfaceOrientations of the topViewController
    // Otherwise, viewController will rotate irrespective of the value returned by the ViewController
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if let ctrl = self.topViewController {
            return ctrl.supportedInterfaceOrientations
        }
        return super.supportedInterfaceOrientations
    }

    // Look for the shouldAutorotate of the topViewController
    // Otherwise, viewController will rotate irrespective of the value returned by the ViewController
    override open var shouldAutorotate: Bool {
        if let ctrl = self.topViewController {
            return ctrl.shouldAutorotate
        }
        return super.shouldAutorotate
    }
}

आईओएस 6 एसडीके के साथ यह समस्या है: मुझे कुछ विचार हैं जिन्हें घुमाने की अनुमति दी जानी चाहिए (उदाहरण के लिए एक वीडियोव्यू), और कुछ ऐसा नहीं है। अब मुझे समझ में आया कि मुझे app.s Info.plist में सभी झुकावों की जाँच करनी है और फिर प्रत्येक ViewController में हल करना है कि क्या होना चाहिए। लेकिन यह काम नहीं करता है! एप्लिकेशन हमेशा ओरिएंटेशन के लिए घूमता है, जो Info.plist में दिए गए हैं।

Info.plist:

<key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>

किसी भी ViewController कि घुमाने के लिए अनुमति नहीं दी जानी चाहिए:

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

- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

अवलोकन: ऐप लैंडस्केप और पोर्ट्रेट ओरिएंटेशन के लिए घूमता है। किसी भी विचार क्यों या क्या मैं गलत कर रहा हूँ?

चीयर्स, मार्क

संपादित करें: मेरे नवीनतम निष्कर्ष यह भी संकेत देते हैं, कि यदि आप अपने ऐप में किसी बिंदु पर रोटेशन करना चाहते हैं, तो आपको अपनी परियोजना सेटिंग्स या Info.plist में सभी चार रोटेशन दिशाओं को सक्रिय करना होगा। इसका एक विकल्प ओवरराइड करना है

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

अपने AppDelegate में, जो Info.plist को ओवरराइड करता है। अब यह संभव नहीं है कि आप अपने Info.plist में केवल पोर्ट्रेट सेट कर सकें और फिर कुछ व्यूऑट्रोलर में रोटेशन करना चाहिए।


@ शिमन्स्की अर्टेम का जवाब अच्छा है, लेकिन मुझे लगता है कि सबसे ऊपर (वर्तमान में दिखाई देने वाला) कंट्रोलर का उपयोग करना बेहतर उपाय है:

@interface UINavigationController(InterfaceOrientation)

@end

@implementation UINavigationController(InterfaceOrientation)

- (NSUInteger) supportedInterfaceOrientations {
    if (self.viewControllers.count > 0){
        return [[self.viewControllers objectAtIndex:[self.viewControllers count] - 1] supportedInterfaceOrientations];
    }
    return UIInterfaceOrientationMaskAll;
}

@end

इस श्रेणी को जोड़ने का प्रयास करें:

@interface UINavigationController(InterfaceOrientation)

@end

@implementation UINavigationController(InterfaceOrientation)

- (NSUInteger) supportedInterfaceOrientations {
    if (self.viewControllers.count > 0)
        return [[self.viewControllers objectAtIndex:0] supportedInterfaceOrientations];
    else
        return UIInterfaceOrientationMaskAll;
}

@end

इसके अलावा @CSmith और @ इवानसचेनबर्ग के अलावा।

यदि आपके पास कुछ दृश्य हैं जो घूमते हैं, और कुछ दृश्य जो नहीं करते हैं, तो आपको UITabBarController का एक कस्टम उदाहरण बनाना होगा, फिर भी प्रत्येक UIViewController अभी भी तय करने दें।

- (BOOL)shouldAutorotate;
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    UIViewController * top;
    UIViewController * tab = self.selectedViewController;
    if([tab isKindOfClass:
        ([UINavigationController class])]) {
        top = [((UINavigationController *)tab)
                 topViewController];
    }

    if ([top respondsToSelector:@selector(supportedInterfaceOrientations)])
        return [top supportedInterfaceOrientations];
    else
        return [super supportedInterfaceOrientations];
}

यदि आपका ViewController UINavigationController या UITabBarController का बच्चा है, तो यह आपकी समस्या है। आपको उस अभिभावक दृश्य नियंत्रक को उप-वर्ग करने की आवश्यकता हो सकती है, जैसे आपने अपने प्रश्न में दिखाए गए अनुसार उन InterfaceOrientation विधियों को ओवरराइड किया है

संपादित करें:

केवल TabBarController चित्र के लिए उदाहरण

           @interface MyTabBarController : UITabBarController
            {
            }
            @end

            @implementation MyTabBarController

            // put your shouldAutorotateToInterfaceOrientation and other overrides here        
            - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
                return (interfaceOrientation == UIInterfaceOrientationPortrait);
            }

            - (NSUInteger)supportedInterfaceOrientations{ 
                return UIInterfaceOrientationMaskPortrait; 
            } 

        @end

यहाँ CSmith के दृष्टिकोण का एक और विकल्प है।

यदि आप पूर्व-iOS 6 व्यवहार को दोहराना चाहते हैं, जहां नेविगेशन स्टैक / टैब बार में सभी विचारों को झुकाव के एक स्वीकार्य सेट पर सहमत होना है, तो इसे UITabBarController या UINavigationController अपने उपवर्ग में रखें:

- (NSUInteger)supportedInterfaceOrientations
{
    NSUInteger orientations = [super supportedInterfaceOrientations];

    for (UIViewController *controller in self.viewControllers)
        orientations = orientations & [controller supportedInterfaceOrientations];

    return orientations;
}




screen-rotation