2

我有一个始终以纵向模式呈现的应用程序(在 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”中调用它,这个rootViewController在 AppDelegate.m 中定义。

这是我第一次做这样的事情,我一直在寻找解决方案,但仍然是同样的问题。对此有什么建议吗?

4

2 回答 2

5

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

事实上,我在方向限制中只保留了肖像。然后,当我将手机横向向右或向左转动时,我以模态方式调用我的 ARViewController,但在加载它之前,我通过如下所示进行适当的旋转来强制此视图控制器横向(在 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];}

编辑:在斯威夫特 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
    }
}
于 2012-10-23T10:47:23.223 回答
0

我发现首先,阻止整个应用程序旋转的是项目摘要表。您应该做的是取消选择项目摘要表中的限制,只需像您希望的那样在每个 UIViewController 中放置一个方法。在您拥有的 UIViewController 中,使该方法可用于横向并实现该方法

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

苹果怎么说:

willRotateToInterfaceOrientation:持续时间:

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

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

参数

到接口方向

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

期间

挂起轮换的持续时间,以秒为单位。

讨论

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

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


所以,这似乎是您正在寻找的方法。只需实现这一点,并将您的视图调用代码放入其中,它应该可以工作。(另外,将其中之一放在呈现的视图中以在旋转回来时返回)

此外,您应该考虑不要以模态方式呈现视图控制器,因为它无论如何都在旋转,并且很明显显示正在发生变化。

于 2012-10-22T00:57:27.630 回答