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

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

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

4 ответа

Решение

Вам нужно свернуть свой собственный для 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 к вашему окну и добавьте все дальнейшие интерфейсы в представление контроллера (не непосредственно в окно), и контроллер позаботится обо всех поворотах для вас:

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

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

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

myNewWindow!.rootViewController = self

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

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

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

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

Вы можете установить rootController для своего UIWindow. например:

fileprivate(set) var bottonOverlayWindow = UIWindow()

self.bottonOverlayWindow.rootViewController = self; 

// 'self' будет ViewController, для которого вы добавили представление UIWindow. Поэтому всякий раз, когда вы ViewController меняете ориентацию, ваше окно также меняет свою ориентацию.

Сообщите мне, если у вас возникнут проблемы.

Другие вопросы по тегам