- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
根据此处的 UIViewController
文档,
使用 [UIViewController attemptRotationToDeviceOrientation]
强制系统尝试将界面旋转到新的方向。我试图通过以下方式强制将界面从纵向旋转到横向:
forceLandscape
标志[UIViewController attemptRotationToDeviceOrientation]
-supportedInterfaceOrientations
并检查标志以更改支持的方向,例如这会强制再次调用-supportedInterfaceOrientations
,看起来像
- (NSUInteger)supportedInterfaceOrientations {
return self.forceLandscape ? UIInterfaceOrientationMaskLandscapeLeft : UIInterfaceOrientationMaskPortrait;
}
即使 -supportedInterfaceOrientations
被调用并返回新方向,界面也不会旋转。我已确认该项目允许所有方向,并且此 View Controller 是窗口的 Root View Controller 。有没有其他人遇到过这个问题并找到了解决方案?我知道解决此问题的所有技巧(呈现和消除模态等),但如果可能的话,我想要一个干净的解决方案。我已经在 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 仅旋转界面的方向,当且仅当设备本身已旋转。
例如,如果您的 View Controller 仅支持纵向,并且用户将设备旋转为横向,则不会发生界面旋转。当设备处于横向时,假设您的代码切换了一个允许横向的标志。界面方向会发生什么变化?没什么,因为设备方向已经发生。要使界面方向与设备方向相匹配,您需要调用 attemptRotationToDeviceOrientation。
在我自己的代码中,我最近创建了一个自定义的多部分 View 动画,如果界面旋转发生在它的中间,它看起来就不正确。所以我在简短的动画中关闭了界面旋转。如果用户在动画期间旋转设备,则不会出现界面方向。但是,当界面方向重新打开时,界面不会旋转以匹配设备方向,直到我调用 attemptRotationToDeviceOrientation。
关于iphone - +attemptRotationToDeviceOrientation 失败时强制设备旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19125263/
根据此处的 UIViewController 文档, https://developer.apple.com/library/ios/documentation/uikit/reference/UIV
我是一名优秀的程序员,十分优秀!