2013-04-15 2 views
1

В прямой ссылки на этот вопрос:Предотвратить вращение ABPersonViewController и ABNewPersonViewController на iOS6

How to stop rotation of ABPersonViewController & ABNewPersonViewController in Landscape mode in iphone

Как я могу предотвратить этот экран от вращения в IOS 6, когда я не один толкая контроллер представления ? Сценарий: я создаю новый контакт, а затем пользователь нажимает кнопки «Создать новый контакт» или «Добавить в существующий контакт». Созданный экран является ABNewPersonViewController, но поскольку у меня нет прямого доступа к методам вращения, я не могу предотвратить его вращение.

Скриншот:

enter image description here

Это изображение берется из подкласса ABUnknownPersonViewController, в этом подкласс только функциональность я реализован, чтобы переопределить методы вращения следующим образом:

- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    if(toInterfaceOrientation == UIInterfaceOrientationPortrait) 
     return YES; 

    return NO; 
} 

Однако проблема заключается в том, что я не могу подклассифицировать экран ABNewPersonViewController, который выталкивается, когда одна из кнопок в e над изображением нажата, чтобы переопределить вращение на iOS 6. Любые идеи о том, как я могу законно получить доступ к этим кнопкам ИЛИ переопределить вращение на экране, которое было нажато, чтобы это не было сделано?

UPDATE 1:

Я попытался создать категорию на ABNewPersonViewController и ABUnknownPersonViewController, что перегрузили методы вращения (не идеальный, я знаю), а затем по всему миру импортируемого, но это не сработало. Кроме этого, я полностью придерживаюсь идей о том, как отменить это поведение. Какие-либо предложения?

UPDATE 2:

Можно ли получить ссылку на кнопки в этом UITableView и переопределить методы, которые они называют? Или это нарушает условия Apple, обращаясь к частным API? Пытаться исследовать этот подход до сих пор и не получить никуда.

+0

В iOS 6, какие виды ориентации могут вращаться, управляется контроллером представления, если только представленный вид не является полноэкранным (модальным). Можете ли вы подробно рассказать о своей иерархии диспетчера просмотров/навигации? Зная, какие контроллеры просмотра у вас есть и что представляет, я могу помочь вам выяснить, где использовать методы ориентации для блокировки изменений ориентации. –

+0

Снимок экрана выше - это вершина стека контроллера View, он был вставлен в стек и является подклассом ABUnknownPersonViewController, в этом подклассе я переопределяю методы вращения, чтобы предотвратить его вращение. Когда нажата кнопка «Создать или добавить существующую», ABNewPersonViewController представлен из подкласса ABUnknownPersonViewController, но у меня нет доступа к этому коду, надеюсь, что это объяснит это. – Tim

+0

А, ок, см. Мой ответ ниже. –

ответ

6

КСН 6, обработка вращения изменилось. Существует две возможности для предотвращения вращения:

  1. Вы можете настроить все ваше приложение только для поддержки ориентации на изображение в вашем Info.plist.
  2. Вы можете переопределить метод в прикладной делегат:

    - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
    { 
        return UIInterfaceOrientationMaskPortrait; 
    } 
    

    Поскольку этот метод вызывается делегата при изменении ориентации или новый контроллер представления нажата, вы можете даже использовать его, чтобы временно отключить пейзаж дисплей:

    // In AppDelegate.h: 
    @property (nonatomic) BOOL portraitOnly; 
    
    // In AppDelegate.m: 
    - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
    { 
        return _portraitOnly ? UIInterfaceOrientationMaskPortrait : UIInterfaceOrientationMaskAllButUpsideDown; 
    } 
    
    // to switch to portrait only: 
    ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = YES; 
    
    // to switch back to allowing landscape orientations as well: 
    ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = NO; 
    

Оба методы вполне приемлем для представления в App Store, так как эти только для использования опубликованного и документированного поведение.

+0

Это будет препятствовать тому, чтобы какой-либо конкретный контроллер просмотра в приложении, к которому, к сожалению, нужно повернуть к пейзажу! – Tim

+0

Это не должно быть, если вы используете решение с 'portraitOnly'! Перед представлением контроллера просмотра лица установите 'portraitOnly' на' YES' и установите для него значение «НЕТ» перед тем, как отклонить контроллер представления лица. Тогда он должен работать нормально. Если у вас все еще есть проблемы, сообщите мне, у меня есть рабочий пример и вы можете добавить больше кода, если хотите. –

+0

Спасибо! Я думаю, что это будет здорово, немного похоже на хак. Но похоже единственное решение. – Tim

1

Отказ от ответа Таммо Фризе. Я предполагаю, что представление, которое должно позволить ландшафту, меньше в стеке представлений, чем ваш пользовательский ABUnknownPersonViewController. Если это так в вашем ABUnknownPersonViewController подкласс над добавить

- (void) viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = YES; 
} 
- (void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:(BOOL)animated];  
    ((AppDelegate *)[UIApplication sharedApplication].delegate).portraitOnly = NO; 
} 
+0

К сожалению, я не могу использовать какие-либо библиотеки на этом этапе проекта для небольшого дефекта, подобного этому. – Tim

0

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

Вместо того чтобы создавать подкласс ABPersonViewController, создать подкласс UINavigationController с этим кодом:

- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait); 
} 


- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

Используйте этот новый подкласс при создании UINavigationController для ABPersonViewController вы представляете. Если UINavigationController не представляется модально (и вместо этого вложен в UITabBarController или другой контроллер представления), вам также нужно будет также поместить эти методы в этот контроллер представления.

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