我有一个应用程序总是以纵向模式呈现(在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
。
这是我第一次做这样的事情,我一直在寻找解决方案,但仍然是同样的问题。这方面有什么建议吗?
发布于 2012-10-23 10:47:23
我终于解决了这个问题,我想还有其他选择,但这一个很好用:
事实上,我只保留了肖像中的方向限制。然后,当我在横屏中向右或向左转动手机时,我会以模态方式调用我的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];}
编辑:在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
}
}
发布于 2012-10-22 00:57:28
我发现,首先,阻止整个应用程序旋转的是项目汇总表。您应该做的是取消选择项目摘要表中的限制&只需在每个UIViewController中按您希望的方式放入一个方法。在您已有的UIViewController中,使该方法可用于横向方向并实现该方法
[UIViewControllerSubclass willRotateToInterfaceOrientation:<interfaceOrientation> duration:<NSTimeInterval>]
苹果的说法:
willRotateToInterfaceOrientation:持续时间:
在用户界面开始旋转之前发送到视图控制器。
参数
toInterfaceOrientation
用户界面的新方向。可能的值在UIInterfaceOrientation中描述。
持续时间
挂起循环的持续时间,以秒为单位。
讨论
子类可以重写此方法,以便在轮换之前立即执行其他操作。例如,可以使用此方法禁用视图交互、停止媒体回放或临时关闭昂贵的图形或实时更新。您还可以使用它将当前视图交换为反映新界面方向的视图。调用此方法时,interfaceOrientation属性仍包含视图的原始方向。
无论您的代码是执行一步还是两步循环,都会调用此方法。
因此,这似乎就是您正在寻找的方法。只需实现这一点,并将您的视图调用代码放入其中&它应该可以工作。(另外,将其中一个放在显示的视图中,以便在旋转回来时返回)
此外,您应该考虑不以模态的方式呈现视图控制器,因为它正在以任何方式旋转,并且很明显显示正在改变。
https://stackoverflow.com/questions/13002477
复制