gpt4 book ai didi

iphone - +attemptRotationToDeviceOrientation 失败时强制设备旋转

转载 作者:可可西里 更新时间:2023-11-01 03:39:59 31 4
gpt4 key购买 nike

根据此处的 UIViewController 文档,

https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/clm/UIViewController/attemptRotationToDeviceOrientation

使用 [UIViewController attemptRotationToDeviceOrientation] 强制系统尝试将界面旋转到新的方向。我试图通过以下方式强制将界面从纵向旋转到横向:

  • 在尝试旋转之前设置一个 forceLandscape 标志
  • 调用 [UIViewController attemptRotationToDeviceOrientation]
  • 在我的 View Controller 中实现 -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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com