我正在为我的应用添加额外的UIWindow。 我的主窗口正确旋转,但我添加的这个附加窗口不会旋转。
根据当前设备方向旋转UIWindow的最佳方法是什么?
答案 0 :(得分:44)
您需要为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]];
}
根据您的窗口大小,您可能还需要更新框架。
答案 1 :(得分:10)
只需使用自己的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
当然,也可以在界面构建器中使用单行代码创建完全相同的设置(除了在显示窗口之前设置帧大小以填充整个屏幕)。
答案 2 :(得分:3)
您需要设置新窗口的rootViewController。然后窗口的子视图将正确旋转。
myNewWindow!.rootViewController = self
然后您可以在旋转方法中更改帧。
e.g。 (在ios8中迅速)
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
customAlertView.frame = UIScreen.mainScreen().bounds
}
答案 3 :(得分:1)
我不知道你对窗户做了什么。但根控制器需要使用YES响应shouldAutorotate。
答案 4 :(得分:0)
您可以为UIWindow设置rootController。例如:
fileprivate(set) var bottonOverlayWindow = UIWindow()
self.bottonOverlayWindow.rootViewController = self;
//'self'将在其上添加UIWindow视图的ViewController。因此,每当ViewController更改方向时,您的窗口视图也会更改其方向。
让我知道您是否遇到任何问题。