我正在使用AutoLayout在iPad应用程序上工作,如果用户启用某种模式(“抬头”模式),我想只支持纵向(或纵向颠倒)方向,此外,如果设备在风景,我想自动切换到纵向模式 .
在顶视图控制器中,我有以下内容:
- (NSUInteger) supportedInterfaceOrientations {
if (self.modeHeadsUp) {
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
} else {
return UIInterfaceOrientationMaskAll;
}
}
- (BOOL) shouldAutorotate {
return TRUE;
}
基于我在其他地方看到的答案,答案似乎是我应该使用"application setStatusBarOrientation" . 因此,在用户选择"heads-up"模式的方法中,我包括:
UIApplication *application = [UIApplication sharedApplication];
[application setStatusBarOrientation:UIInterfaceOrientationPortrait
animated:YES];
但是,这根本就没有做任何事情 . 虽然我可以物理移动设备以使其旋转为纵向,但它不会自动移动 .
实际上,在运行上面的代码后尝试以横向模式尝试以编程方式设置方向时,当我使用以下代码查询应用程序“statusBarOrientation”时,它对于横向保持为“4”:
UIApplication *application = [UIApplication sharedApplication];
int orientation = [application statusBarOrientation];
self.movesTextView.text = [NSString stringWithFormat:@"ORIENTATION %d", orientation];
好像autolayout可能没有被setStatusBarOrientation触发,所以我试图在之后添加这个代码,没有效果:
[super updateViewConstraints];
[self.view updateConstraints];
我意识到Apple希望将设备方向放在用户手中 . 但是,我希望能够在不进行“抬头”模式时支持横向模式 .
我错过了能够强制改变方向的东西吗?
16 回答
我遇到的问题与你相似 . 我需要锁定某些屏幕的设备方向(如Login)并允许其他屏幕旋转 .
经过一些更改并在下面得到一些答案后,我通过以下方式完成了
shouldAutorotate
方法:-(BOOL)shouldAutorotate{ return NO; }
希望这对你有用 .
这是iOS 7,8,9,10的完整工作示例如何将应用方向更改为当前相反的方向
Objective-C
Swift 3
对于iOS 7和8:
Objective-C的:
斯威夫特3:
我在
- viewDidAppear:
中称呼它 .用这个 . 定位问题的完美解决方案..更早和更早
当条件发生变化时,您需要调用attemptRotationToDeviceOrientation (UIViewController)使系统调用
supportedInterfaceOrientations
.这对我有用
Xcode
6&5 .请尝试使用您的代码 .
一旦用户选择任何选项,然后调用此方法,因为用户可以处于横向模式,然后他可以在同一个视图控制器中只设置纵向模式,因此自动视图应该移动到纵向模式,以便在该按钮中调用此方法
确实有效但您必须在视图控制器中返回shouldAutorotate并带YES
但是如果你这样做,你的VC会在用户旋转设备时自动旋转...所以我把它改为:
我打电话给
通过按钮单击强制新方向 . 要将shouldAutoRotate设置为NO,我将添加到rootVC中
PS:此解决方法也适用于所有模拟器 .
对我有用的唯一方法是呈现虚拟模态视图控制器 .
当取消模态视图控制器时,将要求VC更新接口方向 .
奇怪的是,当推送/弹出具有不同支持的接口方向的子视图控制器时,UINavigationController正是这样做的(在iOS 6.1,7.0上测试过) .
此解决方案允许您通过暂时覆盖
UIDevice.current.orientation
的值然后要求系统旋转接口以匹配设备的旋转来强制某个接口方向:Important: This is a hack, and could stop working at any moment
在应用程序的根视图控制器中添加以下内容:
确保在“部署信息”下检查所有接口方向:
请求界面方向在您需要的地方更改:
如果您想将应用程序的主视图锁定为纵向,但想要在横向中打开弹出视图,并且您正在使用tabBarController作为rootViewController,则可以在AppDelegate上使用此代码 .
AppDelegate.h
AppDelegate.m
它工作得很好 .
在viewController中,您希望以横向显示,只需使用以下内容:
AppDelegate.h
AppDelegate.m
allowRotation
属性如果你有一个应该保持在纵向模式的UIViewController,只需添加这个覆盖就可以了 .
最好的部分是在显示此视图时没有动画,它刚刚处于正确的方向 .
基础UINavigationController应具有以下回调,以便子项可以决定他们想要的方向 .
如果您只想要纵向模式,在iOS 9(Xcode 7)中,您可以:
转到Info.plist
选择"Supported interface orientations"项目
删除"Landscape(left home button)"和"Landscape(right home button)"
这对我很有帮助....