Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UIViewcontroller的显示方向不正确_Iphone_Objective C_Uiviewcontroller_Uinavigationcontroller_Uiinterfaceorientation - Fatal编程技术网

Iphone UIViewcontroller的显示方向不正确

Iphone UIViewcontroller的显示方向不正确,iphone,objective-c,uiviewcontroller,uinavigationcontroller,uiinterfaceorientation,Iphone,Objective C,Uiviewcontroller,Uinavigationcontroller,Uiinterfaceorientation,我使用presentViewController从另一个视图控制器演示视图控制器 演示视图控制器(“SourceViewController”)创建新的视图控制器,并在演示之前将其分配给导航控制器(因为“NextViewController”需要导航栏和导航控制器) 但是当我呈现视图控制器时,当原始视图控制器处于横向时,“NextViewController”不会以纵向方式呈现,而是像源视图控制器一样以横向方式呈现 // from the source view controller @impl

我使用
presentViewController
从另一个视图控制器演示视图控制器

演示视图控制器(“SourceViewController”)创建新的视图控制器,并在演示之前将其分配给导航控制器(因为“NextViewController”需要导航栏和导航控制器)

但是当我呈现视图控制器时,当原始视图控制器处于横向时,“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
我尝试了许多旋转方法的组合,但未能使其以正确的方向呈现

我认为这是可能的,因为许多苹果组件,如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

PortraitNavigationController *nav = [PortraitNavigationController initWithRootViewController:nextViewController];

[self presentViewController:nav animated:YES];
它用于显示子视图控制器的容器不在正确的位置


我不希望容器视图控制器在显示并关闭
NextViewController
后立即旋转。

旋转设备时,会询问显示的视图控制器支持的旋转和方向-在您的情况下,它是一个UINavigationController,而不是NextViewController的实例。解决此问题的一种方法是将UINavigationController子类化,重写旋转方法,并将调用转发到它的根视图

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


另一个选项是,如果不需要使用导航控制器进行任何操作,只需在NextViewController内部alloc和init一个UINavigationBar,并将其添加为子视图。在这种情况下,autolayout很方便,因为您可以将它固定在顶部、左侧和右侧,并让它确定正确的大小和位置

所以NextViewController应该是“NextViewController:UINavigationController”,然后创建一个私有视图控制器?如果将“NextViewController”添加到NavigationController中会发生什么?感谢您的帮助-我尝试了子类解决方案,并添加了编辑编辑如果您知道如何解决该问题,您将需要对执行演示的视图控制器执行同样的操作。当视图控制器被解除时,原始视图控制器处于相同的方向是正常的,因此它不会旋转回您想要的位置。提供布局代码以支持两个方向(autolayout的优势)或添加相关的方向代码。不要忘记实现supportedInterfaceOrientations以返回受支持方向的掩码。