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 меняете ориентацию, ваше окно также меняет свою ориентацию.
Сообщите мне, если у вас возникнут проблемы.