IPhone - UIWindow вращается в зависимости от текущей ориентации?

Я добавляю дополнительный UIWindow в свое приложение. Мое главное окно вращается правильно, но это дополнительное окно, которое я добавил, не вращается.

Каков наилучший способ повернуть UIWindow в соответствии с текущей ориентацией устройства?

Ответ 1

Вам нужно перевернуть свой файл для 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]];

}

В зависимости от размера вашего окна вам может понадобиться также обновить фрейм.

Ответ 2

Просто создайте UIViewController со своим собственным UIView, назначьте его как rootViewController вашему окну и добавьте весь дополнительный пользовательский интерфейс в представление контроллера (не непосредственно к окну), и контроллер позаботится о все повороты для вас:

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

Конечно, точно такую ​​же настройку можно также создать в построителе интерфейса без единой строки кода (кроме того, чтобы установить размеры кадра, чтобы заполнить весь экран перед отображением окна).

Ответ 3

Я не знаю, что вы что-то делаете с окном. Но корневой контроллер должен реагировать на shouldAutorotate с помощью YES.

Ответ 4

Вам нужно установить новое окно rootViewController. Затем окна будут правильно вращаться.

myNewWindow!.rootViewController = self

Затем вы можете изменять кадры в методах вращения.

например. (быстрый в ios8)

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