2011-01-19 4 views
1

Проблема. Я получаю очень странную ошибку в своем приложении. У меня есть UITabBarController с несколькими контроллерами представлений для вкладок. В контроллерах представления я реализовал авторотацию через shouldAutorotateToInterfaceOrientation:, и он работал нормально, пока не сделал следующее изменение.Авторотация отключена после установки selectedIndex свойство UITabBarControllers (ошибка SDK?)

Я реализовал жесты пальцев в контроллерах вида для изменения между вкладками. Это достигается с помощью следующего кода.

- (void)onSwipeLeft { 
    int _count = [[self.tabBarController.tabBar items] count]; 
    int i = self.view.tag - 1; 
    if (i < _count - 1) { 
    self.tabBarController.selectedIndex = (i + 1) % _count; 
    } 
} 

И аналогично для onSwipeRight.

Теперь авторотация работает только , пока вы не проведите пальцем влево или вправо. После этого shouldAutorotateToInterfaceOrientation: никогда не вызывается вообще.

См. Также.

  • В this thread идентичная проблема описана. Я также иногда вижу сообщение в журнале: -[UIWindow beginDisablingInterfaceAutorotation] overflow on <UIWindow: 0x1410e0; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x141190>>. Ignoring. Я не могу найти другую информацию об этом.

  • This question, похоже, описывает ту же проблему.

  • This question, похоже, описывает аналогичную проблему, но с popViewController:. Обратите внимание, что ошибка была там с SDK 3.2.

Что делать? Кажется, что ошибка в SDK, которая все еще присутствует в 4.1. Кто-нибудь нашел обходное решение? Это похоже на общий сценарий.

+0

ли ваша UITabViewController соответствует автоматического поворота? поскольку он является родителем других представлений, он также должен допускать поворот. –

+0

Я пробовал подклассифицировать UITabViewController и возвращать 'YES' в' shouldAutorotateToInterfaceOrientation: ', но это не помогло. –

ответ

0

Я должен был подумать об этом раньше.

UIWindow+ensureAutorotation.h Создать:

#import <UIKit/UIKit.h> 

@interface UIWindow (ensureAutorotation) 

- (void)beginDisablingInterfaceAutorotation; 
- (void)endDisablingInterfaceAutorotation; 

@end 

И UIWindow+ensureAutorotation.m:

#import "UIWindow+ensureAutorotation.h" 

@implementation UIWindow (ensureAutorotation) 

- (void)beginDisablingInterfaceAutorotation {} 
- (void)endDisablingInterfaceAutorotation{} 

@end 

// of course this can be added as a simple category, rather than .h .m files 
+0

вы можете объяснить, почему это решение ... пустой метод? –

+0

Это может вызвать побочные эффекты, поскольку вы переписываете метод UIKit внутри расширения, не обращая внимания на то, что делает оригинальный метод. Выполнение этого не рекомендуется, более того, делая это внутри расширения, очень неясно, потому что вы на самом деле не знаете, какая реализация будет иметь место. Представьте, если вы предоставляете более одного расширения, которое перезаписывает один и тот же метод ... что произойдет? – Lio