![](/img/trans.png)
[英]Force iOS ViewController to rotate to device orientation after unlocking programmatic rotation lock
[英]Force device rotation with +attemptRotationToDeviceOrientation failing
根据这里的UIViewController
文档,
使用[UIViewController attemptRotationToDeviceOrientation]
强制系统尝试将接口旋转到新方向。 我试图通过以下方式强制界面从纵向旋转到横向:
forceLandscape
标志 [UIViewController attemptRotationToDeviceOrientation]
-supportedInterfaceOrientations
并检查标志以更改支持的方向,例如 这会强制再次调用-supportedInterfaceOrientations
,看起来像
- (NSUInteger)supportedInterfaceOrientations {
return self.forceLandscape ? UIInterfaceOrientationMaskLandscapeLeft : UIInterfaceOrientationMaskPortrait;
}
即使正在调用-supportedInterfaceOrientations
并返回新方向,接口也不会旋转。 我已经确认该项目允许所有方向,并且该视图控制器是窗口的根视图控制器。 有没有其他人遇到这个问题并找到了解决方案? 我知道所有修复这个问题(提出和解雇模态等),但如果可能的话,我想要一个干净的解决方案。 我已在iOS 6和7上验证了此问题。
以下是重现的完整代码:
@interface ALTViewController ()
@property (nonatomic, assign) BOOL forceLandscape;
@end
@implementation ALTViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.forceLandscape = NO;
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:@"button" forState:UIControlStateNormal];
[button sizeToFit];
[self.view addSubview:button];
button.center = self.view.center;
[button addTarget:self
action:@selector(buttonPressed:)
forControlEvents:UIControlEventTouchUpInside];
}
- (void)buttonPressed:(id)sender
{
self.forceLandscape = YES;
[UIViewController attemptRotationToDeviceOrientation];
}
- (NSUInteger)supportedInterfaceOrientations
{
return self.forceLandscape ? UIInterfaceOrientationMaskLandscapeLeft : UIInterfaceOrientationMaskPortrait;
}
调用attemptRotationToDeviceOrientation仅旋转接口的方向,当且仅当设备本身已旋转时。
例如,如果视图控制器仅支持纵向方向,并且用户将设备旋转到横向,则不会发生界面旋转。 当设备处于横向时,让我们说你的代码切换一个允许横向方向的标志。 接口方向会发生什么? 没什么,因为已经发生了设备方向。 要使接口方向与设备方向匹配,您需要调用attemptRotationToDeviceOrientation。
在我自己的代码中,我最近创建了一个自定义的多部分视图动画,如果界面旋转发生在它的中间,它看起来不正确。 所以我在简短的动画期间关闭了界面旋转。 如果用户在动画期间旋转设备,则不会发生界面方向。 但是,当重新打开界面方向时,在我调用attemptRotationToDeviceOrientation之前,界面不会旋转以匹配设备方向。
您可以尝试使用以下内容实现:setStatusBarOrientation:animated: https : //developer.apple.com/library/ios/documentation/uikit/reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/ setStatusBarOrientation:animated :
这对我来说也是一个类似的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.