2015-08-01 13 views
11

Ho un'app con 9-10 schermate. Ho incorporato uno UINavigationController nel mio controller di visualizzazione. Ho pochi controller di visualizzazione che desidero impostare solo con orientamento verticale: significa che la rotazione del dispositivo non deve ruotare questi controller di visualizzazione in modalità orizzontale. Ho provato le seguenti soluzioni:Come forzare o disabilitare l'orientamento dell'interfaccia per alcuni ma non tutti UIViewController?

prima:

NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationPortrait]; 
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; 

ma schermo ruota ancora al paesaggio.

Secondo: Ho creato una classe controller visualizzazione personalizzata come PortraitViewController e ha aggiunto il codice qui sotto in PortraitViewController.m

@interface PortraitViewController() 
@end 

@implementation PortraitViewController 
- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    //Here check class name and then return type of orientation 
    return UIInterfaceOrientationMaskPortrait; 
} 
@end 

Dopo che ho implementato PortraitViewController.h come classe base

#import <UIKit/UIKit.h> 
#import "PortraitViewController.h" 
@interface Login : PortraitViewController 
@end 

Lo fa non funziona affatto, consente comunque al controller della vista di ruotare in modalità orizzontale.

C'è qualche altra soluzione che sto usando iOS 8 & non vuoi che il controllo del viewcontroller ruoti in modalità orizzontale?

EDIT: E 'possibile avere orientamento orizzontale solo per alcuni controller di vista, e la forza gli altri orientamento della vista controllori di rispettare ritratto?

+0

dove hai scritto le prime due righe? – iAnurag

+0

In ViewDidLoad @ iAnurag – TechGuy

+1

@JulianM ha pubblicato la risposta corretta.Tuttavia, stai prendendo dei rischi con la coerenza della tua applicazione, dal momento che i controller di visualizzazione nascosti non riceveranno messaggi di orientamento. Dovresti prendere in considerazione la riprogettazione della tua interfaccia e mettere a punto la tua esperienza utente, – SwiftArchitect

risposta

1

Devi farlo manualmente. Tutti i controller di visualizzazione, in quelli che non si desidera ruotare la vista, implementano il seguente metodo.

- (BOOL)shouldAutorotate 
{ 
    return NO; 
} 
+0

Devo impostare alcuni delegati per l'utilizzo di questo metodo? – TechGuy

+0

Non funziona per me? @Sweet – TechGuy

+0

Non è necessario impostare delegato, è il metodo di classe 'UIViewController'. – VRAwesome

7

Prova alla sottoclasse il UINavigationController che si sta utilizzando, perché il default UINavigationController non inoltra il metodo shouldAutorotate a voi viewController.

Implementare il seguente metodo nella vostra UINavigationController sottoclasse

- (BOOL)shouldAutorotate 
{ 
    return [self.visibleViewController shouldAutorotate]; 
} 

Ora i UINavigationController in avanti il ​​metodo di chiamata al suo attuale visibile UIViewController quindi è necessario implementare shouldAutorotate lì individualmente per ottenere l'effetto desiderato.

5

Il tuo PortraitViewController è ok e non conosco la tua configurazione di Storyboard. Nel tuo caso la cosa importante è che devi incorporare il tuo controller di visualizzazione di destinazione in un altro nuovo controller di navigazione, quindi impostare la classe sul tuo PortraitViewController e presentare la navigazione in modo modale, come ho fatto nell'immagine sottostante e funziona come previsto.

enter image description here

If you want to show animation that will make presentation animation like push animation

Di seguito è mio PortrateNavigation sottoclasse di UINavigationController

PortrateNavigation.h

#import <UIKit/UIKit.h> 

@interface PortrateNavigation : UINavigationController 

@end 

PortrateNavigation.m

#import "PortrateNavigation.h" 

@implementation PortrateNavigation 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (UIInterfaceOrientationMask)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskPortrait; 
} 

@end 
3

creare una categoria sulla UINavigationController e sovrascrivere supportedInterfaceOrientations

#import "UINavigationController+Orientation.h" 

@implementation UINavigationController (Orientation) 

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

-(BOOL)shouldAutorotate 
{ 
    return YES; 
} 

@end 

quando è stato incorporato UINavigationController, contenitori non chiedono ai loro figli se ruotare o meno

5

Prova ad aggiungere questo metodo insieme a shouldAutorotate e supportedInterfaceOrientations

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { 
//Setting the orientation of the view. I've set it to portrait here. 
return UIInterfaceOrientationPortrait; 

}

Inoltre è possibile utilizzare questo [UIViewController attemptRotationToDeviceOrientation] In modo che ruoti al nuovo orientamento desiderato

0

Se si desidera disattivare temporaneamente la rotazione automatica, evitare manipolando le maschere di orientamento per farlo. Invece, sovrascrivere il metodo shouldAutorotate sul controller della vista iniziale. Questo metodo viene chiamato prima di eseguire qualsiasi autorotazione. Se restituisce NO, la rotazione viene soppressa.

Quindi è necessario sottoclasse 'UINavigationController', implementare shouldAutorotate e utilizzare la classe del controller di navigazione nello storyboard.

- (BOOL)shouldAutorotate 

{ 

id currentViewController = self.topViewController; 


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

return YES; 

}

un approccio alternativo può essere trovato su

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

1

Tr questo nel vostro controller di vista

- (BOOL)shouldAutorotate{ 
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationPortrait | 
      UIInterfaceOrientationPortraitUpsideDown; 
} 

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{ 
    return UIInterfaceOrientationPortrait; 
} 
1

1) Effettuare una variabile bool in AppDelegate .

2) quindi copiare & pasta sottostante Codice in AppDelegate.m (modificarlo secondo il vostro requisito)

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{NSLog(@"%d", [UIDevice currentDevice].orientation) 

if (self.isLandscape == YES) //bool created in first step 
{ 
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; 
} 

return UIInterfaceOrientationMaskPortrait; 
} 

3) Ora copia incolla & sotto codice nel metodo viewWillAppear del controller della vista di cui si voglio forzare l'orientamento.

[AppDelegate sharedAppDelegate].isLandscape = YES; //bool created in first step 
NSNumber *value1 = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]; //change the orientation as per your requirement 
[[UIDevice currentDevice] setValue:value1 forKey:@"orientation"]; 

4) Ora prima di premere questo controller di vista, è necessario impostare prima il bool. Quindi, supponiamo che vogliate spingere il controller della vista ABC

[AppDelegate sharedAppDelegate].isLandscape = YES; 
[self.navigationController pushViewController:<ABC view controller instance> animated:NO]; 

Spero che questo aiuti !!

+0

Non dovrebbe il tipo restituito 'supportedInterfaceOrientationsForWindow:' be 'UIInterfaceOrientationMask' invece di 'NSUInteger'? –

+0

@ CharlieScott-Skinner Sì. Puoi scriverlo lì. Ma siccome la definizione suggerisce "typedef NS_OPTIONS (NSUInteger, UIInterfaceOrientationMask)" puoi anche digitare NSUInteger. –

+0

In effetti :) Sembravo solo un avvertimento inutile al tempo per poco guadagno ... –