iPhone - UIWindow, вращающееся в зависимости от текущей ориентации? - PullRequest
27 голосов
/ 14 июля 2011

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

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

Ответы [ 4 ]

44 голосов
/ 14 июля 2011

Вам нужно накатить свой собственный для 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]];

}

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

10 голосов
/ 02 декабря 2014

Просто создайте 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 голосов
/ 30 марта 2015

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

myNewWindow!.rootViewController = self

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

например (swift в ios8)

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

1 голос
/ 14 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...