2013-06-28 4 views
18

У меня есть проект, используя UINavigationController и segues работает должным образом хорошо, все они вращаются правильно, дело в том ... Я просто хочу, чтобы отключить autorotation на определенном UIViewController. Я попытался это:отключение автоповорота на одном UIViewController в iOS6

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

// New Autorotation support for iOS 6. 
- (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0){ 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

, но это не работает, мой UIViewController продолжает вращаться автоматически, любая помощь будет приветствоваться :)

+0

Команды авторотации только отправляются на один контроллер просмотра в любой момент времени. как я справился с этим, сделав все мои контроллеры view, которые я когда-либо мог на экране в iVars в своем appdelegate. Затем, в зависимости от того, какой элемент управления представлением в настоящее время присутствует, я определяю, какие ориентации действительны для текущего отображаемого представления. Это не работает, если вам нужно несколько на экране одновременно, извините. – Putz1103

ответ

34

Per в View Controller Programing Руководство

Если вы хотите временно отключить автоматическое вращение, избегайте манипулирования масками ориентации для этого. Вместо этого переопределите метод shouldAutorotate на начальном контроллере представления. Этот метод вызывается перед выполнением любой авторотации. Если он возвращает NO, тогда вращение будет подавлено.

Так что вам нужно подклассировать «UINavigationController», реализовать shouldAutorotate и использовать свой класс контроллера навигации в своем раскадровке.

- (BOOL)shouldAutorotate 
{ 
    id currentViewController = self.topViewController; 

    if ([currentViewController isKindOfClass:[DetailViewController class]]) 
     return NO; 

    return YES; 
} 
+0

это сработало !!! Большое спасибо –

+3

Это может быть очевидно для некоторых, но это решение не работает, если вы не используете UINavigationController для управления иерархией навигации вашего приложения. – AWrightIV

4

Попробуйте осуществить это в вашем UIViewController: ответ

// implements the interface orientation (iOS 6.x) 
@interface UINavigationController (RotationNone) 
-(NSUInteger)supportedInterfaceOrientations; 
@end 

@implementation UINavigationController (RotationNone) 
-(NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 
@end 
+0

привет !!! , когда я реализовал это правило, он применил для всех моих UIViewControllers, от исходного до последнего из них, я думал, что он работал в первый раз: p –

15

Собираюсь полная GayleDDS для новичков только что добавили подкласс UINavigationController, как он предложил так:

#import "UINavigationController.h" 
#import "MonthCalendarVC.h" 

@implementation UINavigationController (overrides) 
- (BOOL)shouldAutorotate 
{ 
    id currentViewController = self.topViewController; 

    if ([currentViewController isKindOfClass:[MonthCalendarVC class]]) 
     return NO; 

    return YES; 
} 
@end 

MonthCalendarVC это viewController, который я хочу быть только в портретном режиме (фиксированный), а затем просто добавил импорт в мой appdelegate.m.

#import "UINavigationController.h" 

и вот оно

+0

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

+0

Как я понял, контроллер навигации активен почти на всем моем приложении, потому что он отображает мои контроллеры представлений, поэтому он спрашивает, является ли мой текущий контроллер вида MonthCalendar для разрешения вращения или нет, поэтому я подклассифицировал мой UINavigationController, добавив, что дополнительные функции –

+0

Это не подкласс, это категория в 'UINavigationController'. Поведение, заставляющее это работать, не гарантируется (переопределение метода из категории). –

5

Взгляните на этот другой подход:

http://www.sebastianborggrewe.de/only-make-one-single-view-controller-rotate/

Вы просто должны реализовать canRotate в ViewController, чтобы обеспечить вращение.

Прекрасно работает на прошивке 7.

2015-01-30 Поскольку сайт Себастьяна, кажется, не работает (404 ошибки), это моя интерпретация ее решения:

В отличии от Себастьяна, я предпочитайте использовать протокол (например, интерфейс на C#), чтобы избежать создания метода «- (void) canrotate:« в каждом из моих контроллеров представления.

IRotationCapabilities.h 
----------------------- 

#ifndef NICE_APPS_IRotationCapabilities_h 
#define NICE_APPS_IRotationCapabilities_h 

@protocol IRotationCapabilities <NSObject> 

// Empty protocol 

@end 

#endif 


FirstViewController.h 
--------------------- 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [ super viewWillAppear:animated ]; 

    // Forces the portrait orientation, if needed 
    if(![ self conformsToProtocol:@protocol(IRotationCapabilities) ]) 
    { 
     if(self.navigationController.interfaceOrientation != UIInterfaceOrientationPortrait) 
     { 
      [ [ UIDevice currentDevice ] setValue:@(1) forKey:@"orientation" ]; 
     } 
    } 
} 

SecondViewController.h 
----------------------- 

#import "IRotationCapabilities.h" 

@interface SecondViewController : UIViewController <IRotationCapabilities> 


AppDelegate.m 
------------- 

#pragma mark - Orientation management 

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

    if(__iPhone) 
    { 
     // Gets topmost/visible view controller 
     UIViewController * currentViewController = [ self topViewController ]; 

     // Checks whether it implements rotation 
     if([ currentViewController conformsToProtocol:@protocol(IRotationCapabilities) ]) 
     { 
      // Unlock landscape view orientations for this view controller 
      return (UIInterfaceOrientationMaskAllButUpsideDown); 
     } 

     // Allows only portrait orientation (standard behavior) 
     return (UIInterfaceOrientationMaskPortrait); 
    } 
    else 
    { 
     // Unlock landscape view orientations for iPad 
     return (UIInterfaceOrientationMaskAll); 
    } 
} 
+0

Простое решение - спасибо за это. – JanB