iPhone - UIWindow根据当前方向旋转?

时间:2011-07-14 17:41:52

标签: iphone objective-c screen-orientation uiwindow

我正在为我的应用添加额外的UIWindow。 我的主窗口正确旋转,但我添加的这个附加窗口不会旋转。

根据当前设备方向旋转UIWindow的最佳方法是什么?

5 个答案:

答案 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更改方向时,您的窗口视图也会更改其方向。

让我知道您是否遇到任何问题。