Я добавляю дополнительный UIWindow в свое приложение. Мое главное окно вращается правильно, но это дополнительное окно, которое я добавил, не вращается.
Каков наилучший способ повернуть UIWindow в соответствии с текущей ориентацией устройства?
Я добавляю дополнительный UIWindow в свое приложение. Мое главное окно вращается правильно, но это дополнительное окно, которое я добавил, не вращается.
Каков наилучший способ повернуть UIWindow в соответствии с текущей ориентацией устройства?
Вам нужно перевернуть свой файл для 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
Конечно, точно такую же настройку можно также создать в построителе интерфейса без единой строки кода (кроме того, чтобы установить размеры кадра, чтобы заполнить весь экран перед отображением окна).
Я не знаю, что вы что-то делаете с окном. Но корневой контроллер должен реагировать на shouldAutorotate с помощью YES.
Вам нужно установить новое окно rootViewController. Затем окна будут правильно вращаться.
myNewWindow!.rootViewController = self
Затем вы можете изменять кадры в методах вращения.
например. (быстрый в ios8)
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
customAlertView.frame = UIScreen.mainScreen().bounds
}