2010-04-29 3 views

ответ

8

Если вы не хотите, чтобы ваши контроллеры просмотров вращаются, просто переопределите метод контроллера toAutoRotateToInterface, чтобы вернуть false для любой ориентации, которую вы не хотите поддерживать ... Here is a reference.

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

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

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

+2

Я думаю, что он все еще хочет, чтобы он вращался, но чтобы использовать другую анимацию или вообще не анимацию. –

+0

изменил ответ, чтобы отразить это – Daniel

+0

, который сделал трюк. –

16

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

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

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


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

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

Удачи вам в вашем проекте.

+8

Для совместимости с iOS 6+ (и предыдущей) вы можете поместить [UIView setAnimationsEnabled: NO] в willRotateToInterfaceOrientation: duration: вместо shouldAutorotateToInterfaceOrientation: –

+4

Не забудьте вызвать супер-реализацию, если вы переопределите их. В частности, документы Apple говорят, что если вы переопределяете willRotateToInterfaceOrientation: duration: or didRotateFromInterfaceOrientation: «Ваша реализация этого метода должна вызвать супер в какой-то момент во время его выполнения». – levigroker

+0

Вот версия Swift ... http://stackoverflow.com/a/6292506/294884 – Fattie

0

Ответ от @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]; 
} 
+0

Действительно ??? Почему документы говорят о 8+? –

+0

Этот блок никогда не звонил мне ..... – Kevin

+0

Просто повторно протестирован в отладчике, запустив iOS 8.4, и он определенно вызывается, когда я вращаю устройство. Для PKCLsoft

Смежные вопросы