it-swarm.com.de

iOS 6-Rotationen: unterstütztInterfaceOrientations nicht

Ich habe dieses Problem mit iOS 6 SDK: Ich habe einige Ansichten, die gedreht werden sollten (z. B. ein Videoview), und einige, die dies nicht tun App´s Info.plist und dann in jedem ViewController herausfinden, was passieren soll. Aber es geht nicht! Die App dreht sich immer zu den Ausrichtungen, die in der Info.plist angegeben sind.

Info.plist:

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

jeder ViewController, der sich nicht drehen darf:

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

- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

Beobachtung: Die App dreht sich in Querformat und Hochformat. Irgendwelche Ideen warum oder was mache ich falsch?

Prost, Marc

Bearbeiten: Meine neuesten Erkenntnisse zeigen auch an, dass Sie, wenn Sie zu einem bestimmten Zeitpunkt in Ihrer App eine Drehung haben möchten, haben, um alle vier Drehrichtungen in Ihren Projekteinstellungen oder in der Info.plist zu aktivieren. Eine Alternative dazu ist das Überschreiben 

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

in Ihrem AppDelegate, das die Info.plist überschreibt. Es ist nicht mehr möglich, nur das Portrait in Ihrer Info.plist festzulegen und dann in einem ViewController eine Rotation auszuführen, indem sollte. Sollte. 

36
stk

Wenn Ihr ViewController einem UINavigationController oder UITabBarController untergeordnet ist, liegt das Problem bei Ihnen. Möglicherweise müssen Sie diesen übergeordneten Ansichtscontroller untergliedern, indem Sie diese InterfaceOrientation-Methoden einfach überschreiben, wie Sie es in Ihrer Frage gezeigt haben

BEARBEITEN:

Beispiel für nur Portrait 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
31
CSmith

Zusätzlich zu der obigen Antwort von CSmith ermöglicht der folgende Code in einer UINavigationController-Unterklasse die Delegierung an den Top-View-Controller in der Art und Weise, wie ich es erwartet hatte:

- (BOOL)shouldAutorotate;
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if ([[self topViewController] respondsToSelector:@selector(supportedInterfaceOrientations)])
        return [[self topViewController] supportedInterfaceOrientations];
    else
        return [super supportedInterfaceOrientations];
}
27
Evan Schoenberg

Hier ist eine weitere Alternative zu CSmiths Ansatz.

Wenn Sie das Verhalten vor iOS 6 replizieren möchten, bei dem alle Ansichten in der Navigationsleiste/der Registerkartenleiste zulässige Orientierungen festlegen müssen, fügen Sie dies in Ihre Unterklasse UITabBarController oder UINavigationController ein:

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

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

    return orientations;
}
8
Glenn Schmidt

Versuchen Sie, diese Kategorie hinzuzufügen:

@interface UINavigationController(InterfaceOrientation)

@end

@implementation UINavigationController(InterfaceOrientation)

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

@end
2
Shimanski Artem

Wenn Sie UINavigationController und Swift verwenden, können Sie diese Erweiterung zu Ihrem Projekt hinzufügen. Danach delegieren Navigationscontroller die Kontrolle an ihren untergeordneten Controller.

extension UINavigationController {
    override public func supportedInterfaceOrientations()
    -> UIInterfaceOrientationMask {
        if let ctrl = topViewController {
            return ctrl.supportedInterfaceOrientations()
        }
        return super.supportedInterfaceOrientations()
    }

    override public func shouldAutorotate() -> Bool {
        if let ctrl = topViewController {
            return ctrl.shouldAutorotate()
        }
        return super.shouldAutorotate()
    }
}
1
Alvivi

@Alvivis Antwort aktualisiert für Swift 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
    }
}
0
Harikrishna Pai

Weitere Ergänzung zu @CSmith und @EvanSchoenberg.

Wenn Sie einige Ansichten haben, die sich drehen, und andere, die dies nicht tun, müssen Sie eine benutzerdefinierte Instanz von UITabBarController erstellen, wobei sich dennoch UIViewController entscheiden lässt.

- (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];
}
0
SwiftArchitect