9

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]
  • ビューコントローラーに実装-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;
}
4

2 に答える 2

11

AttemptRotationToDeviceOrientation の呼び出しは、デバイス自体が回転されている場合にのみ、インターフェイスの向きを回転させます。

たとえば、View Controller が縦向きのみをサポートしていて、ユーザーがデバイスを横向きに回転させた場合、インターフェイスの回転は発生しません。デバイスが横向きであったときに、横向きを許可するフラグをコードで切り替えるとします。インターフェイスの向きはどうなりますか? デバイスの向きが既に発生しているため、何もありません。インターフェイスの向きをデバイスの向きと一致させるには、attemptRotationToDeviceOrientation を呼び出す必要があります。

私自身のコードでは、最近、インターフェイスの回転が途中で発生した場合に正しく表示されない、カスタムのマルチパート ビュー アニメーションを作成しました。そのため、短いアニメーションの間はインターフェイスの回転をオフにしました。アニメーション中にユーザーがデバイスを回転させた場合、インターフェイスの向きは発生しません。ただし、インターフェースの向きをオンに戻すと、attemptRotationToDeviceOrientation を呼び出すまで、インターフェースはデバイスの向きに合わせて回転しませんでした。

于 2013-10-01T20:39:36.423 に答える
2

setStatusBarOrientation:animated: https://developer.apple.com/library/ios/documentation/uikit/reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/で何かを達成しようとすることができますsetStatusBarOrientation:animated :

これにより、同様の問題が修正されました。

于 2013-10-02T08:27:34.073 に答える