iOS:在旋转iphone后,从仅支持纵向模式的视图控制器直接呈现横向视图控制器

Tíb*_*íbó 2 iphone uiviewcontroller ios

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

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

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ 
  return YES;
}
Run Code Online (Sandbox Code Playgroud)

在第二个视图控制器(ARViewController.m)显示为全部按顺序后,我必须旋转iphone一次.

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

ARViewController *arVC = [[ARViewController alloc] initWithNibName:@"ARViewController" bundle:nil];
[self presentModalViewController:arVC animated:YES];
Run Code Online (Sandbox Code Playgroud)

我从"ViewController.m"调用它,这个被定义为rootViewControllerAppDelegate.m中的.

这是我第一次做这样的事情,我寻找解决方案,但仍然是同样的问题.关于这个的任何提示?

Tíb*_*íbó 5

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

事实上,我只保留了纵向限制.然后当我向右或向左转动手机时,我会以模态方式调用我的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];}
Run Code Online (Sandbox Code Playgroud)

编辑:在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
    }
}
Run Code Online (Sandbox Code Playgroud)