4

只需要将 iOS 5 应用程序更新到 iOS 6,当然偶然发现了界面方向问题。我现在已经知道事情发生了变化,我什至知道发生了什么变化,但我似乎仍然无法独自管理它。

我的应用程序由几个视图控制器组成,它们被推送到导航控制器上。所有视图控制器都应该是横向的,除了一个应该是纵向的。在 iOS 5 中一切正常,但现在纵向模式的一个控制器也显示为横向模式,当然会失真。

我的 iOS 5 代码如下所示:

横向模式下的视图控制器:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
return (interfaceOrientation==UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation==UIInterfaceOrientationLandscapeRight);
}

纵向模式下的视图控制器:

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

现在我发现了我实现的 iOS 6 的变化

AppDelegate:(允许所有方向,如在 plist 中)

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
return UIInterfaceOrientationMaskLandscapeLeft|UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

横向模式下的视图控制器:(将方向限制为横向模式)

- (NSUInteger) supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

- (BOOL)shouldAutorotate{ 
return YES;
}  

纵向模式下的视图控制器:(将方向限制为纵向模式)

- (NSUInteger) supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
return UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown;
}

- (BOOL)shouldAutorotate { 
return YES;
}

据我了解,这应该有效,但事实是它比以前更有效。首先,横向模式的视图控制器不会停留在横向模式,它们可以向各个方向自由旋转,这当然不是我想要的。其次,纵向模式下的视图控制器会崩溃

Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'preferredInterfaceOrientationForPresentation must return a supported interface orientation!'

经过反复试验,我似乎只能通过 plist 文件/appdelegate 将所有控制器锁定为横向模式,这当然会强制纵向模式控制器也进入横向模式。另一方面,我可以设法让纵向模式控制器处于正确的方向,但这也会将横向模式控制器旋转到纵向模式。我似乎无法让两者都工作。

有任何想法吗?

4

2 回答 2

7

好的,我修好了。

我为 UINavigationController 创建了一个类别

@implementation UINavigationController (Rotation_IOS6)

-(BOOL)shouldAutorotate
{
return [self.topViewController shouldAutorotate];
}

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [self.topViewController preferredInterfaceOrientationForPresentation];
}

@end

将视图控制器的值转发到导航控制器...

我还必须用 presentViewController 替换 presentModalViewController,因为第一个现在已弃用。

顺便说一句,是的,我的 appdelegate 中有一个错字……这是正确的。

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskLandscapeLeft|UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskPortraitUpsideDown;
}
于 2012-10-11T10:50:04.077 回答
0

刚刚观察到,在您的 UIInterfaceOrientationMaskLandscapeLeft 中,在 appdelegate LandscapeRight 中写了两次缺少如果它只是拼写错误并且在更正后仍然面临问题

我发现只有 rootViewControllers - (BOOL)shouldAutorotate; 被叫。这里你的 rootViewController 是 NavigationController。对于推送的 viewController,这不会被调用,所以你只能从 navControllers 方法中决定对推送视图的方向支持。以下为我的 navControllers 推送 viewController
Override UINavigationControllers 方法工作

- (BOOL)shouldAutorotate;
- (NSUInteger) supportedInterfaceOrientations;

代码对你来说是这样的

@implementaion UINavigationController(Rotation)

- (BOOL)shouldAutorotate
{
return YES;
}

- (NSUInteger) supportedInterfaceOrientations
{
    NSArray *viewsArray = [self viewController]//stack of pushed controller

    NSUInteger orientationToReturn = assignAllMask;

    for(UIViewController *temp in  viewsArray)
    {
        if([temp isKindOfClass:MyOnlyLandscapeViewController] == YES )
        {
            orientationToReturn = assignLandscapeMask;
            break;
        }
        else if([temp isKindOfClass:MyOnlyPortraitViewController] == YES )
        {
            orientationToReturn = assignPortraitMask;
            break;
        }
    }

    return orientationToReturn;
}

@end
于 2012-10-10T19:45:32.533 回答