2013-05-31 5 views
1

Я видел этот столбельный пост: shouldAutorotateToInterfaceOrientation is not working in iOS 6. Ответ состоял в том, чтобы добавить категорию под названием RotationIn_IOS6. Я сделал это, и представления для разных контроллеров view корректно работают в iOS6. Проблема в iOS5.shouldAutorotateToInterfaceOrientation не работает в iOS 5

Мне нужно только несколько видов для поворота во всех направлениях, остальные должны быть в портрете или в PortraitUpsideDown. Проблема, с которой я сталкиваюсь, состоит в том, что либо все не вращаются (code1), либо после того, как она вращается в ландшафт, она остается в той же ориентации, пока вы не вернетесь к портрету (код2).

Code1:

@implementation UINavigationController (RotationIn_IOS6) 
-(BOOL)shouldAutorotate 
{ 
    return [[self.viewControllers lastObject] shouldAutorotate]; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [[self.viewControllers lastObject] supportedInterfaceOrientations]; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 

     return UIInterfaceOrientationIsPortrait(interfaceOrientation); 
} 
@end 

Код 2:

@implementation UINavigationController (RotationIn_IOS6) 
-(BOOL)shouldAutorotate 
{ 
    return [[self.viewControllers lastObject] shouldAutorotate]; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [[self.viewControllers lastObject] supportedInterfaceOrientations]; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if([self.visibleViewController isKindOfClass:[MyClassToRotate class]]) 
    { 
     return [self.visibleViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
    } 
    else 
    { 
     return UIInterfaceOrientationIsPortrait(interfaceOrientation); 
    } 

} 

нужны некоторые рекомендации по этому вопросу. Не знаете, как это решить.

EDIT:

Code3:

1) Удалены shouldAutorotateToInterfaceOrientation из категории. 2) Добавлен этот код для моего конкретного класса

- (BOOL)shouldAutorotate 
{ 
    //returns true if want to allow orientation change 
    return TRUE; 


} 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    //decide number of origination tob supported by Viewcontroller. 
    return UIInterfaceOrientationMaskAll; 


} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    //from here you Should try to Preferred orientation for ViewController 
    return TRUE; 
} 

Результата -> Всех ViewController заперты в портрете. Не удается получить доступ к PortraitUpsideDown. После того, как в моем ViewController, он может вращаться, но когда вы выходите из ViewController, запертый в пейзаже ..

EDIT 2:

Каждый ViewController содержит этот код:

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


- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

- (BOOL)shouldAutorotate { 
    return NO; 
} 

ответ

0

Нет необходимости переопределить shouldAutorotateToInterfaceOrientation: в категории контроллера навигации, а вместо iOS 5 каждый контроллер вашего вида должен реализовать shouldAutorotateToInterfaceOrientation: с поддерживаемой ориентацией. Поддерживаемые ориентации, определенные контроллером контейнера (навигационным контроллером), находятся только в iOS6 и выше. В нижней версии он будет вызывать shouldAutorotateToInterfaceOrientation: контроллера зрения ребенка, который собирается показать

+0

обновил вопрос с code3 .. – lakesh

+0

У меня уже есть shouldAutorotateToInterfaceOrientation в моем коде ... – lakesh

0

Чтобы решить эту проблему я уже подклассы UINavigationController вместо использования категории:

MyNavigationcontroller.h

#import <UIKit/UIKit.h> 
@interface MyNavigationcontroller : UINavigationController 
@end 

MyNavigationcontroller.m

#import "MyNavigationcontroller.h" 
@interface MyNavigationcontroller() 
@end 

//Set your init... 

-(BOOL)shouldAutorotate { 
    if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"YourClass")]) 
     return YES; 
    } 
     return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations { 

    if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"YourClass")]) { 
     return UIInterfaceOrientationMaskAll; 
    } 
     return UIInterfaceOrientationMaskPortraitUpsideDown; 
} 

@end 

Тогда в каждом ViewController переопределение:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationMaskPortraitUpsideDown);//or your orientation 
} 

Затем на старте, в didFinishLaunchingWithOptions: вашего приложения делегат:

NSString *reqSysVer = @"6.0"; 
NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
    if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) { 
     self.navigationController = [[MyNavigationcontroller alloc] initWithRootViewController:masterViewController];//IOS 6 
    }else{ 
     self.navigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController]; 
    } 
self.window.rootViewController = self.navigationController; 
+0

я попробовал ваш и он по-прежнему не работает .. – lakesh

+0

@lakesh Странно, я на самом деле с помощью этого кода, вы настройки Поддерживаемые ориентации интерфейса на вкладке «Сводка целей»? Там вам нужно активировать всю ориентацию (4 кнопки серого цвета). – Mat

+0

Нет .. Я вообще не касался этой вкладки ... задал вопрос, чтобы показать, что я добавляю в каждый из моих контроллеров viewcontroller ... – lakesh

0

Самый простой способ мишенями> Общие-> Информация развертывания и отметьте которые вы хотите. Например. отметьте только портрет, и приложение не будет автоматически вращаться.

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