我使用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
后,我不希望容器视图控制器完全旋转。
答案 0 :(得分:1)
当您旋转设备时,会询问呈现的视图控制器它支持的旋转和方向 - 在您的情况下,它是UINavigationController而不是NextViewController的实例。修复此问题的一种方法是继承UINavigationController并覆盖旋转方法并将调用转发到它的根视图。
作为一方而非UIImagePickerController是UINavigationController的子类。使NexViewController成为UINavigationController的子类更有意义,然后在该子类中使用正确的根视图控制器初始化它。
另一种选择是在NextViewController中分配和初始化UINavigationBar,如果你不需要使用导航控制器那么就把它添加为子视图。在这种情况下,autolayout会派上用场,因为你可以将它固定在顶部,左侧和右侧,让它找出正确的尺寸和位置。