UIViewcontroller没有以正确的方向呈现

时间:2014-06-22 20:21:21

标签: iphone objective-c uiviewcontroller uinavigationcontroller uiinterfaceorientation

我使用presentViewController从另一个视图控制器呈现视图控制器。

呈现视图控制器(" SourceViewController")创建新的视图控制器并在呈现之前将其分配给导航控制器(因为" NextViewController"需要导航栏和导航控制器)。

// from the source view controller
@implementation SourceViewController

-(void)showNextViewController
{
NextViewController *viewController = [[NextViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];

[self presentViewController:viewController animated:YES];
}
@end


@implementation NextViewController
// in NextViewController

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

@end

但是当我在原始视图控制器处于横向状态时呈现视图控制器时," NextViewController"不是以肖像方式呈现,而是像源视图控制器一样呈现在风景中。

我尝试了许多旋转方法的组合,但还没有能够让它以正确的方向呈现。

我认为这是可能的,因为像UIImagePickerController这样的许多苹果组件总是以纵向呈现,那么我该如何强制它的方向呢?

由于

修改

我创建了一个UINavigationController子类:

PortraitNavigationController : UINavigationController

@implementation

-(BOOL)shouldAutorotate
{
    return NO;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

@end

然后在展示NextViewController

PortraitNavigationController *nav = [PortraitNavigationController initWithRootViewController:nextViewController];

[self presentViewController:nav animated:YES];

现在NextViewController确实是纵向的 - 但是当我旋转设备以使用此视图控制器并最终将其关闭时 - 底层的源视图控制器看起来全部搞砸了。

底层视图控制器是一个嵌入在UINavigationController

中的自定义容器视图控制器

用于显示子视图控制器的容器不在正确的位置

在显示和解除NextViewController后,我不希望容器视图控制器完全旋转。

1 个答案:

答案 0 :(得分:1)

当您旋转设备时,会询问呈现的视图控制器它支持的旋转和方向 - 在您的情况下,它是UINavigationController而不是NextViewController的实例。修复此问题的一种方法是继承UINavigationController并覆盖旋转方法并将调用转发到它的根视图。

作为一方而非UIImagePickerController是UINavigationController的子类。使NexViewController成为UINavigationController的子类更有意义,然后在该子类中使用正确的根视图控制器初始化它。

另一种选择是在NextViewController中分配和初始化UINavigationBar,如果你不需要使用导航控制器那么就把它添加为子视图。在这种情况下,autolayout会派上用场,因为你可以将它固定在顶部,左侧和右侧,让它找出正确的尺寸和位置。