アプリにUIWindowを追加しています。メインウィンドウは正しく回転しますが、追加したこの追加ウィンドウは回転しません。
現在のデバイスの向きに従ってUIWindowを回転させる最良の方法は何ですか?
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]];
}
ウィンドウのサイズによっては、フレームも更新する必要がある場合があります。
独自の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で作成することもできます(ウィンドウを表示する前に画面全体に表示されるようにフレームサイズを設定することを除いて)。
新しいウィンドウのrootViewControllerを設定する必要があります。そうすると、ウィンドウのサブビューが正しく回転します。
_myNewWindow!.rootViewController = self
_
次に、rotateメソッドでフレームを変更できます。
例えば(ios8のスイフト)
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { customAlertView.frame = UIScreen.mainScreen().bounds }
あなたが窓で何かをしているのかわかりません。ただし、ルートコントローラーはshouldAutorotateにYESで応答する必要があります。
UIWindowのrootControllerを設定できます。例えば:
fileprivate(set) var bottonOverlayWindow = UIWindow()
self.bottonOverlayWindow.rootViewController = self;
// 'self'は、UIWindowビューを追加したViewControllerになります。したがって、ViewControllerが方向を変更するたびに、ウィンドウビューもその方向を変更します。
問題が発生した場合はお知らせください。