web-dev-qa-db-ja.com

iPhone-現在の向きに応じてUIWindowが回転しますか?

アプリにUIWindowを追加しています。メインウィンドウは正しく回転しますが、追加したこの追加ウィンドウは回転しません。

現在のデバイスの向きに従ってUIWindowを回転させる最良の方法は何ですか?

27
aryaxt

UIWindow用に独自にロールする必要があります。

UIApplicationDidChangeStatusBarFrameNotification通知をリッスンし、ステータスバーが変更されたときに変換を設定します。

-[UIApplication statusBarOrientation]から現在の方向を読み取り、次のように変換を計算できます。

#define DegreesToRadians(degrees) (degrees * M_PI / 180)

- (CGAffineTransform)transformForOrientation:(UIInterfaceOrientation)orientation {

    switch (orientation) {

        case UIInterfaceOrientationLandscapeLeft:
            return CGAffineTransformMakeRotation(-DegreesToRadians(90));

        case UIInterfaceOrientationLandscapeRight:
            return CGAffineTransformMakeRotation(DegreesToRadians(90));

        case UIInterfaceOrientationPortraitUpsideDown:
            return CGAffineTransformMakeRotation(DegreesToRadians(180));

        case UIInterfaceOrientationPortrait:
        default:
            return CGAffineTransformMakeRotation(DegreesToRadians(0));
    }
}

- (void)statusBarDidChangeFrame:(NSNotification *)notification {

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

    [self setTransform:[self transformForOrientation:orientation]];

}

ウィンドウのサイズによっては、フレームも更新する必要がある場合があります。

44
Morten Fast

独自のUIViewControllerを使用してUIViewを作成し、それをrootViewControllerとしてウィンドウに割り当て、さらにすべてのUIを(ウィンドウに直接ではなく)コントローラーのビューに追加します。コントローラがすべての回転を処理します。

UIApplication * app = [UIApplication sharedApplication];
UIWindow * appWindow = app.delegate.window;

UIWindow * newWindow = [[UIWindow alloc] initWithFrame:appWindow.frame];
UIView * newView = [[UIView alloc] initWithFrame:appWindow.frame];
UIViewController * viewctrl = [[UIViewController alloc] init];

viewctrl.view = newView;
newWindow.rootViewController = viewctrl;

// Now add all your UI elements to newView, not newWindow.
// viewctrl takes care of all device rotations for you.

[newWindow makeKeyAndVisible];
// Or just newWindow.hidden = NO if it shall not become key

もちろん、1行のコードなしでまったく同じセットアップをInterface Builderで作成することもできます(ウィンドウを表示する前に画面全体に表示されるようにフレームサイズを設定することを除いて)。

10
Mecki

新しいウィンドウのrootViewControllerを設定する必要があります。そうすると、ウィンドウのサブビューが正しく回転します。

_myNewWindow!.rootViewController = self
_

次に、rotateメソッドでフレームを変更できます。

例えば(ios8のスイフト)

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { customAlertView.frame = UIScreen.mainScreen().bounds }

3
hstdt

あなたが窓で何かをしているのかわかりません。ただし、ルートコントローラーはshouldAutorotateにYESで応答する必要があります。

1
Hot Licks

UIWindowのrootControllerを設定できます。例えば:

fileprivate(set) var bottonOverlayWindow = UIWindow()

self.bottonOverlayWindow.rootViewController = self; 

// 'self'は、UIWindowビューを追加したViewControllerになります。したがって、ViewControllerが方向を変更するたびに、ウィンドウビューもその方向を変更します。

問題が発生した場合はお知らせください。

0
Nishant Sharma