2015-02-06 4 views
0

Я делаю this, пытаясь увидеть в ландшафте только галерею, но все, что я получаю, чтобы показать ландшафтную ориентацию, когда я подключаю фотогалерею с помощью основного ViewController:Перейдите по иерархии модального управления представлением и навигационным контроллером

RootViewController - (модальный переход)> PhotoGallery

проблема, когда я делаю:

Rootviewcontroler - (модальный переход)> ViewControllerModal - (модальный переход)> PhotoGallery

он не работает, и ни работы с контроллером навигации:

RootViewController - (модальный переход)> NavigationController A - (нажать переход)> NavigationController B - (модальный переход)> PhotoGallery

я не знаю, как перемещаться по иерархии до галереи в supportedInterfaceOrientationsForWindow а:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 

if ([self.window.rootViewController.presentedViewController isKindOfClass: [PhotoGallery class]]){ 
    PhotoGallery *photoGallery = (PhotoGallery *) self.window.rootViewController.presentedViewController; 
    if (photoGallery.isPresented) return UIInterfaceOrientationMaskLandscape; 
    else return UIInterfaceOrientationMaskPortrait; 
} 

return UIInterfaceOrientationMaskPortrait; 

}

Заранее спасибо.

ответ

0

Я должен был сделать это для приложения электронной коммерции один раз и должен был представить экран подписи - это пейзаж, в то время как остальная часть приложения была в портрете. Для того, чтобы осуществить это, во-первых, мы создали категорию на UIViewController для поддержки принудительную ориентации

@implementation UIViewController (ForcedOrientation) 

-(UIInterfaceOrientationMask)forcedOrientation { 
    // Default implementation is to return none (i.e. no forced orientations); 
    return UIInterfaceOrientationMaskPortrait; 
} 

-(void) forceOrientationAdjustment { 
    UIViewController *root = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 
    UIViewController *dummy = [[UIViewController alloc] init]; 
    [root presentViewController:dummy animated:NO completion:^{ 
     [root dismissViewControllerAnimated:NO completion:nil]; 
    }]; 
} 

@end 

Мы тогда подклассы UINavigationController и отменяют следующие методы:

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    UIViewController *visibleVC = self.topViewController; 

    // Need to find out what the actual "top screen" is 
    while (visibleVC) { 
     if ([visibleVC isKindOfClass:[UINavigationController class]]) { 
      visibleVC = [(UINavigationController*)visibleVC topViewController]; 
      continue; 
     } 
     break; 
    } 

    NSUInteger forcedOrientation = [visibleVC forcedOrientation]; 
    if (forcedOrientation) { 
     return forcedOrientation; 
    } else { 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 

Последний шаг добавить forcedOrientation заехать в контроллере представления мы хотели представить в пейзаж и добавить вызов forceOrientationAdjustment в нашем методе viewDidAppear:

- (UIInterfaceOrientationMask) forcedOrientation { 
    return UIInterfaceOrientationMaskLandscape; 
} 

-(void) viewDidAppear:(BOOL)animated { 
... 
    [self forceOrientationAdjustment] 
... 
} 

Несмотря на то, что это сработало отлично, мне всегда казалось, что это хак. Мы должны были быстро представить этот поддельный контроллер, чтобы изменить ориентацию. Вероятно, имеется лучшее решение, возможно, следующее: How to force a UIViewController to Portrait orientation in iOS 6

Удачи вам!

+0

Спасибо, я попробую. – Javier

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