iOS 6的旋转:supportedInterfaceOrientations doesn'

2019-06-28 08:54发布

有I'm这个问题与iOS 6 SDK:I'm具有应该被允许旋转的一些看法(如videoview),以及一些鸵鸟政策。 现在我明白我要检查在app's Info.plist中所有的方位,然后在每个视图控制器进行梳理,会发生什么。 但它doesn't工作! 该应用始终旋转的方向,这是在给定的Info.plist。

Info.plist的:

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

该shouldn't被允许旋转的任何视图控制器:

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

- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

观察:应用旋转到横向和纵向。 任何想法,为什么还是什么I'm做错了什么?

干杯,马克

编辑:我的最新的研究结果还表明,如果你想在你的应用某些点有旋转,你必须激活您的项目设置或Info.plist的所有四个方向旋转。 这另一种方法是重写

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

在你的AppDelegate,其覆盖的Info.plist。 它isn't可能再通过重写shouldAutorotateToInterfaceOrientation或supportedInterfaceOrientations设置只在您的Info.plist人像,然后具有旋转部分的ViewController。

Answer 1:

如果您的视图控制器是一个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


Answer 2:

添加到上述CSmith:它的答案,在一个UINavigationController子类下面的代码允许代表团中,我预计这摆在首位的工作方式的顶视图控制器:

- (BOOL)shouldAutorotate;
{
    return YES;
}

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


Answer 3:

这里的另一个替代CSmith:它的做法。

如果你要复制的预iOS 6的行为,其中在导航堆栈/标签栏的所有意见必须在允许的组取向的同意,把这个在你的子类UITabBarControllerUINavigationController

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

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

    return orientations;
}


Answer 4:

尝试添加此类别:

@interface UINavigationController(InterfaceOrientation)

@end

@implementation UINavigationController(InterfaceOrientation)

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

@end


Answer 5:

对于使用的UINavigationController和斯威夫特的人,你可以将此扩展添加到您的项目。 在此之后,导航控制器委托控制他们的孩子控制器。

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()
    }
}


Answer 6:

另外除了@CSmith和@EvanSchoenberg。

如果你有一个旋转的一些看法,以及一些看法是不这样做,你必须创建一个自定义实例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];
}


Answer 7:

@ Alvivi的回答更新的雨燕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
    }
}


Answer 8:

@Shimanski阿尔乔姆的答案是好的,但我想用最顶层(当前可见)控制器是更好的解决方案:

@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


Answer 9:

作为替代方法,如果你想在你的应用程序以保持预iOS6的旋转功能:

这里的代码在GitHub是碎冰鸡尾酒的方法需要iOS6的,这样旋转如同它做了iOS4的/ iOS4的一个有益位。 这真的帮了我,因为我支持真正的微管理其旋转的遗留应用程序。 这本来是一个大量的工作,以实现对iOS6的所需要的变化。 荣誉给谁张贴的用户。

https://gist.github.com/3725118



文章来源: iOS 6 rotations: supportedInterfaceOrientations doesn´t work?