Подтвердить что ты не робот

Методы вращения интерфейса iOS8 не называются

Так как willAnimateRotationToInterfaceOrientation:duration: устарел в iOS8, нужно использовать viewWillTransitionToSize:withTransitionCoordinator: вместо.

Однако этот метод не вызван в моем контроллере view на iOS8. Есть ли что-то еще, мне нужно реализовать, чтобы этот обратный вызов работал?

Я ничего не могу найти в документации. Единственное, что я мог найти, это то, что он относится к новому протоколу UIContentContainer. Однако, даже если я добавляю это к протоколам моего контроллера явно, он не работает.

Любые идеи?

4b9b3361

Ответ 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)

В родительском классе, если вы переопределите вышеупомянутый метод, убедитесь, что вы вызываете супер, а также просто найдете другой способ бить головой о стену...