Обнаружение изменения ориентации iOS 8

Запуск на iOS 8, мне нужно изменить интерфейс при повороте моего приложения.

В настоящее время я использую этот код:

-(BOOL)shouldAutorotate
{
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    if (orientation != UIInterfaceOrientationUnknown) [self resetTabBar];

    return YES;
}

Что я делаю, удаляю текущий пользовательский интерфейс и добавляем новый пользовательский интерфейс, соответствующий ориентации. Тем не менее, моя проблема заключается в том, что этот метод вызывается примерно 4 раза каждый раз, когда производится одно вращение.

Каков правильный способ внесения изменений при изменении ориентации в iOS 8?

Ответ 1

Тимур Кучкаров прав, но я отправлю ответ, так как я пропустил его комментарий при первой проверке этой страницы.

Метод определения iOS 8 обнаружения изменения ориентации (вращения) реализует следующий метод контроллера вида:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    // Do view manipulation here.
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

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

Ответ 2

Метод viewWillTransitionToSize:withTransitionCoordinator: вызывается непосредственно перед тем, как представление перешло к новому размеру, как указывает Ник. Однако лучший способ запустить код сразу после перехода на новый размер - использовать блок завершения в методе:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        // your code here
    }];
}

Благодаря этому ответу для кода и Nick для ссылки на него в его комментарии.