Методы вращения интерфейса iOS8 не называются
Так как willAnimateRotationToInterfaceOrientation:duration:
устарел в iOS8, нужно использовать viewWillTransitionToSize:withTransitionCoordinator:
вместо.
Однако этот метод не вызван в моем контроллере view на iOS8.
Есть ли что-то еще, мне нужно реализовать, чтобы этот обратный вызов работал?
Я ничего не могу найти в документации. Единственное, что я мог найти, это то, что он относится к новому протоколу UIContentContainer
. Однако, даже если я добавляю это к протоколам моего контроллера явно, он не работает.
Любые идеи?
Ответы
Ответ 1
viewWillTransitionToSize:withTransitionCoordinator:
кажется, работает только в том случае, если интерфейс действительно изменит размер, то есть мы повернули на 90 градусов. Если у вас есть маска на вашем макете, которая разрешает только пейзаж, то при повороте на 180 градусов размер интерфейса не изменяется, поэтому этот метод, кажется, не называется.
Я работал над этим в своем приложении, вместо этого зарегистрировавшись на уведомление UIDeviceOrientationDidChangeNotification
, например:
(На мой взгляд, контроллер viewWillAppear
):
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
(An в моем viewWillDisappear
[не забудьте отписаться])
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
Мой deviceOrientationDidChange:
выглядит так:
- (void)deviceOrientationDidChange:(NSNotification *)notification {
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
[self willRotateToInterfaceOrientation:orientation duration:1.0];
}
Ответ 2
В соответствии с документами не забудьте позвонить super
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// ...
}
В противном случае контроллеры детского просмотра не получат переданное им сообщение.
Ответ 3
Я знаю, что этот вопрос немного устарел на данный момент, но я думаю, что проблема может быть решена по-другому для тех, кто может столкнуться с этим. Если вы пытаетесь загрузить представление, которое является частью DIFFERENT контроллера, используя addSubview(controller.view)
, вам также необходимо добавить этот контроллер к родительскому объекту (возможно, представление, которое вы добавляете к контроллеру). Если вы не добавите контроллер родителям, вы никогда не получите обновления для изменений размера. Позже мы выяснили причину изменения API Apple; с iPad pro, ваш SizeClass может измениться без вращения с многозадачной способностью. Это также вызовет метод:
viewWillTransitionToSize(size: CGSize,
withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
В родительском классе, если вы переопределите вышеупомянутый метод, убедитесь, что вы вызываете супер, а также просто найдете другой способ бить головой о стену...