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;
}