2013-11-11 3 views
5

У меня есть приложение iPhone, которое поддерживает только ориентацию на портрете. Я хочу добавить к моему контроллеру представления проекта, который будет поддерживать только ландшафтную ориентацию? Является ли это возможным? Если да, то как я могу это достичь?iOS 7. Изменение ориентации страницы только для одного контроллера вида

Я пытался категория файл клети, как это:

@implementation UINavigationController (Rotation_IOS7) 

-(BOOL)shouldAutorotate 
    { 

     return YES; 

    } 

    -(NSUInteger)supportedInterfaceOrientations 
    { 

     return UIInterfaceOrientationMaskLandscape; 

    } 

Если я делаю это я получаю эту ошибку: Нагрузочное приложение из-за неперехваченное исключением UIApplicationInvalidInterfaceOrientation, причина: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES

+0

Да Это вы можете Возможное по этой ссылки http://stackoverflow.com/questions/19827540/locking-portrait-orientation -in-view-ios-7/19830292 # 19830292 – yen

+0

http: // stackoverflow.com/questions/19852408/ipad-app-interface-orientation-changed-after-launch-of-aplicaiton/19852857 # 19852857 – yen

+0

спасибо за ваш ответ, но я не уверен, что это мое дело. в первую очередь мое приложение предназначено только для iOS 7, поэтому я бы предпочел не использовать хаки iOS 6. и если я изменю свой код контроллера навигации таким образом, что касается других контроллеров представления в своей навигационной цепочке? – alexxjk

ответ

0

Edit:

создать категорию в .h, а затем реализовать эти методы

использовать эти методы ods в контроллере вида, где вы хотите поддержать ландшафт

@implementation UINavigationController (Rotation_IOS7) 

-(BOOL)shouldAutorotate 
    { 

     return YES; 

    } 

    -(NSUInteger)supportedInterfaceOrientations 
    { 

     return UIInterfaceOrientationMaskLandscape; 

    } 
+0

оба метода в моем случае не вызываются. есть идеи? – alexxjk

+0

извините мои глупые вопросы suhit, я новичок в разработке iOS. Я попытался создать файл категории и поместил там свой код. Метод wasAutorate вызывался при запуске приложения независимо от того, где я импортировал файл категории .h. то я просто поместил эту реализацию в файл диспетчера .m. shouldAutorated не был вызван вообще. Что я делаю не так? – alexxjk

+0

читайте http://stackoverflow.com/questions/19827540/locking-portrait-orientation-in-view-ios-7?lq=1 и http://stackoverflow.com/questions/12520030/how-to-force- а-UIViewController к Portait ориентации-в-КСН-6? LQ = 1 – suhit

1

У меня есть поиск по многочисленным темам и, наконец, найдено рабочее решение.

В моем примере, у меня есть два ВК:

А -> VC, который встроен в Нав. Контроллер и должен поддерживать только портретный вид.

B -> VC, который не встроен в VC и должен поддерживать только ландшафт.

Я хотел бы перейти от просмотра A, чтобы увидеть B (нажав кнопку) и вернуться к просмотру, затем A с определенными ориентациями по-прежнему верны.

I. Создание категории UINavigationController и написать в своем файле .m: (код будет автоматически вызывается)

- (NSUInteger)supportedInterfaceOrientations 
{ 
    NSLog(@"supportedInterfaceOrientations = %d ", [self.topViewController   supportedInterfaceOrientations]); 

    return [self.topViewController supportedInterfaceOrientations]; 
} 

- (BOOL)shouldAutorotate 
{ 
    return self.topViewController.shouldAutorotate; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

{ 
    // You do not need this method if you are not supporting earlier iOS Versions 

    return [self.topViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
} 

II. Создайте modal segue между A и B и после этого между другим между B и A.

III. Запишите в каждом из контроллеров View .m файлов, следующие:

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscape; 
} 

ИЛИ

- (NSUInteger)supportedInterfaceOrientations 
    { 
     return UIInterfaceOrientationMaskPortrait; 
    } 

После добавления этого кода. Вы сможете изменить ориентацию для одного вида B.

4

Я попытался это, и она работает: http://www.sebastianborggrewe.de/only-make-one-single-view-controller-rotate/

Во-первых, добавить эти код в свой класс AppDelegat.

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { 
// Get topmost/visible view controller 
UIViewController *currentViewController = [self topViewController]; 

// Check whether it implements a dummy methods called canRotate 
if ([currentViewController respondsToSelector:@selector(canRotate)]) { 
    // Unlock landscape view orientations for this view controller 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
} 

// Only allow portrait (standard behaviour) 
return UIInterfaceOrientationMaskPortrait; 
} 

- (UIViewController*)topViewController { 
    return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController]; 
} 

- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController { 
    if ([rootViewController isKindOfClass:[UITabBarController class]]) { 
    UITabBarController* tabBarController = (UITabBarController*)rootViewController; 
    return [self topViewControllerWithRootViewController:tabBarController.selectedViewController]; 
    } else if ([rootViewController isKindOfClass:[UINavigationController class]]) { 
    UINavigationController* navigationController = (UINavigationController*)rootViewController; 
    return [self topViewControllerWithRootViewController:navigationController.visibleViewController]; 
    } else if (rootViewController.presentedViewController) { 
    UIViewController* presentedViewController = rootViewController.presentedViewController; 
    return [self topViewControllerWithRootViewController:presentedViewController]; 
    } else { 
    return rootViewController; 
    } 
} 

Затем в контроллере пейзажного, добавьте этот метод

- (void)canRotate { } 
Смежные вопросы