iOS:在旋转iphone之后,从一个仅支持肖像模式的视图控制器向右呈现视图控制器

我有一个应用程序始终以纵向模式呈现(在Xcode项目的摘要中,只支持纵向方向)。

现在我想要做的是,当我使用应用程序,从任何视图控制器的应用程序,如果我旋转设备的横向权利,应用程序呈现一个视图控制器(ARViewController.m)横向权利,实际上旋转到右侧是呈现ARViewController.m的触发器。 但是我所经历的是,由于第一个视图控制器只支持纵向,即使我将设备定位在右侧,我想从第一个视图中显示的视图控制器(ARViewController.m)也是纵向的,而不是在风景的权利。

即使我在第二个视图控制器(ARViewController.m)中编写它,它也不会自动旋转(这个视图控制器可以在每个方向呈现):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ return YES; } 

第二个视图控制器(ARViewController.m)呈现完毕后,我必须旋转一次iphone。

下面是我如何从第一个视图控制器调用第二个视图控制器(ARViewController.m):

 ARViewController *arVC = [[ARViewController alloc] initWithNibName:@"ARViewController" bundle:nil]; [self presentModalViewController:arVC animated:YES]; 

我从“ViewController.m”调用它,这个被定义为AppDelegate.m中的rootViewController

这是我第一次做这样的事情,我寻找解决scheme,但仍然是同样的问题。 任何提示呢?

我终于解决了这个问题,我想有其他select,但是这个工作正常:

实际上,我只保留了肖像的方向限制。 然后,当我左右转动横向手机,我调用我的AR​​ViewController模态,但在加载之前,我强制这个视图控制器横向(在viewWillAppear)通过做一个适当的旋转像这里:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self transformView2ToLandscape];} -(void) transformView2ToLandscape { NSInteger rotationDirection; UIDeviceOrientation currentOrientation = [[UIDevice currentDevice] orientation]; if(currentOrientation == UIDeviceOrientationLandscapeLeft){ rotationDirection = 1; }else { rotationDirection = -1; } CGAffineTransform transform = [arController.viewController.view transform]; transform = CGAffineTransformRotate(transform, degreesToRadians(rotationDirection * 90)); [arController.viewController.view setTransform: transform];} 

编辑:在Swift 4

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) transformViewToLansdcape() } func transformViewToLansdcape(){ var rotationDir : Int if(UIDeviceOrientationIsLandscape(UIDevice.current.orientation)){ rotationDir = 1 }else{ rotationDir = -1 } var transform = self.view.transform //90 for landscapeLeft and 270 for landscapeRight transform = transform.rotated(by: (rotationDir*270).degreesToRadians) self.view.transform = transform } extension BinaryInteger { var degreesToRadians: CGFloat { return CGFloat(Int(self)) * .pi / 180 } } 

我发现,首先,停止整个应用程序的旋转是项目汇总表。 你应该做的是取消select项目摘要表中的限制,只需在每个UIViewController中放一个方法就像你想的那样。 在你有的UIViewController中,使该方法可用于横向方向并实现该方法

[UIViewControllerSubclass willRotateToInterfaceOrientation:<interfaceOrientation> duration:<NSTimeInterval>]

苹果说:

willRotateToInterfaceOrientation:时间:

在用户界面开始旋转之前发送到视图控制器。

  • (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation持续时间:(NSTimeInterval)持续时间

参数

toInterfaceOrientation

用户界面的新方向 UIInterfaceOrientation中描述了可能的值。

持续时间

未决旋转的持续时间,以秒为单位。

讨论

子类可以重写此方法以在旋转之前立即执行其他操作。 例如,您可以使用此方法禁用视图交互,停止媒体播放,或临时closures昂贵的绘图或实时更新。 您也可以使用它来交换当前的视图,以反映新的界面方向。 当调用此方法时,interfaceOrientation属性仍包含视图的原始方向。

无论您的代码执行一步还是两步旋转,都会调用此方法。


所以,这看起来像你正在寻找的方法。 只要实现这一点,并把你的看法调用代码里面,它应该工作。 (也可以将其中的一个放在显示的视图中,以便在返回时返回)

另外,您应该考虑不要以模态方式显示视图控制器,因为它正在旋转,而且很明显显示器正在改变。