Измените или отключите анимацию вращения iPhone при изменении ориентации

Как изменить или отключить анимацию вращения при изменении ориентации экрана с альбомной на портретную или наоборот?


person Aldrich Co    schedule 29.04.2010    source источник


Ответы (3)


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

В случае, если вы просто хотите обрабатывать вращение каким-либо другим способом, вы можете вернуть false в приведенных выше методах и зарегистрироваться для UIDeviceOrientationDidChangeNotification следующим образом.

    NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
       selector:@selector(handleOrientationDidChange:)
           name:UIDeviceOrientationDidChangeNotification
         object:nil];

Теперь, когда вы получаете уведомления, вы можете делать с ними все, что хотите...

person Daniel    schedule 29.04.2010
comment
Я думаю, он все еще хочет, чтобы он вращался, но использовал другую анимацию или вообще не анимировал. - person Chris Wagner; 29.04.2010
comment
изменил ответ, чтобы отразить это - person Daniel; 29.04.2010

Да, можно отключить анимацию, не разбивая все на части.

Следующие коды отключат анимацию вращения «черного ящика», не связываясь с другими анимациями или кодом ориентации:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    [UIView setAnimationsEnabled:YES];
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    [UIView setAnimationsEnabled:NO];
  /* Your original orientation booleans*/
}

Поместите его в свой UIViewController, и все должно быть хорошо. Тот же метод можно применить к любой нежелательной анимации в iOS.

Желаем удачи с вашим проектом.

person Nils Munch    schedule 09.06.2011
comment
Для совместимости с iOS 6+ (и более ранней) вы можете поместить [UIView setAnimationsEnabled:NO] в willRotateToInterfaceOrientation:duration: вместо shouldAutorotateToInterfaceOrientation: - person Jeff Hay; 26.10.2012
comment
Не забудьте вызвать супер реализацию, если вы переопределяете их. В частности, в документах Apple говорится, что если вы переопределяете willRotateToInterfaceOrientation:duration: или didRotateFromInterfaceOrientation:, ваша реализация этого метода должна вызывать super в какой-то момент во время его выполнения. - person levigroker; 23.08.2013

Ответ @Nils Munch выше: найти для ‹ iOS7. Для iOS 7 или более поздней версии вы можете использовать:

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [UIView setAnimationsEnabled:NO];

    [coordinator notifyWhenInteractionEndsUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        [UIView setAnimationsEnabled:YES];
    }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
person PKCLsoft    schedule 20.12.2014
comment
Только что перепроверил в отладчике под управлением iOS 8.4, и он определенно вызывается, когда я поворачиваю устройство. Однако для ‹ iOS7 это не будет вызываться. - person PKCLsoft; 02.12.2015