[iphone] IOS 6 forza l'orientamento del dispositivo al paesaggio


5 Answers

Questo dovrebbe funzionare, è simile alla versione pre-iOS 6, ma con un UINavigationController :

UIViewController *portraitViewController = [[UIViewController alloc] init];
UINavigationController* nc = [[UINavigationController alloc] initWithRootViewController:portraitViewController];
[self.navigationController presentModalViewController:nc animated:NO];
[self.navigationController dismissModalViewControllerAnimated:NO];

Lo chiamo prima di spingere il prossimo UIViewController . UIViewController il successivo UIViewController spinto a essere visualizzato in modalità Ritratto anche se l'attuale UIViewController è in UIViewController (dovrebbe funzionare anche per Verticale in UIViewController ). Funziona su iOS 4 + 5 + 6 per me.

Question

Ho dato un'app con dire 10 view controller. Io uso il controller di navigazione per caricarli / scaricarli.

Tutti tranne uno sono in modalità verticale. Supponiamo che il settimo VC sia in orizzontale. Ho bisogno che venga presentato in orizzontale quando viene caricato.

Si prega di suggerire un modo per forzare l'orientamento a passare da verticale a orizzontale in IOS 6 (e sarà bello lavorare anche su IOS 5).

Ecco come lo stavo PRIMA di IOS 6:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    UIViewController *c = [[[UIViewController alloc]init] autorelease];
    [self presentModalViewController:c animated:NO];
    [self dismissModalViewControllerAnimated:NO];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

Presentare e respingere un VC modale costringeva l'app a rivedere il suo orientamento, quindi shouldAutorotateToInterfaceOrientation stato necessario richiamareAutorotateToInterfaceOrientation.

Quello che ho provato in IOS 6:

- (BOOL)shouldAutorotate{
    return YES;
}
-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
    return UIInterfaceOrientationLandscapeLeft;
}

Al carico, il controller rimane in verticale. Dopo aver ruotato il dispositivo, l'orientamento cambia solo ok. Ma ho bisogno di far ruotare automaticamente il controller in orizzontale sul carico, quindi l'utente dovrà ruotare il dispositivo per vedere i dati correttamente.

Un altro problema: dopo aver ruotato il dispositivo di nuovo in UIInterfaceOrientationMaskLandscape , l'orientamento passa a UIInterfaceOrientationMaskLandscape , anche se ho specificato in UIInterfaceOrientationMaskLandscape solo UIInterfaceOrientationMaskLandscape . Perché succede?

Inoltre, NONE di cui sopra 3 metodi vengono chiamati.

Alcuni dati (utili):

  1. Nel mio file plist ho specificato 3 orientamenti - tutti ma al contrario.
  2. Il progetto è stato avviato in Xcode 4.3 IOS 5. Tutte le classi incluse le xibs sono state create prima di Xcode 4.5 IOS 6, ora utilizzo l'ultima versione.
  3. Nel file plist la barra di stato è impostata su visibile.
  4. Nel file xib (quello che voglio essere in orizzontale) la barra di stato è "Nessuno", l'orientamento è impostato su orizzontale.

Qualsiasi aiuto è apprezzato. Grazie.




Ho usato lo stesso metodo di OP pre-ios6 (presente e congedo un VC modale) per mostrare un singolo controller di visualizzazione in modalità orizzontale (tutti gli altri in verticale). Si è rotto in iOS6 con il panorama VC che mostra in verticale.

Per risolvere il problema, ho aggiunto il metodo preferitoInterfaceOrientationForPresentation nel panorama VC. Sembra funzionare bene per OS 5 e OS 6 ora.

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

- (BOOL)shouldAutorotate
{
return NO;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{    
return UIInterfaceOrientationLandscapeLeft;
}



L'ho risolto sottoclassando UINavigationController e sovrascrivendo le interfacce supportate di navigazione come segue:

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

Tutti i controller implementati supportano InterfacciaOrientamenti con i loro orientamenti desiderati.




Prova a seguire un UINavigationController che usa una categoria o è sottoclasse per specificare l'orientamento desiderato, quindi passa al VC desiderato. Leggi di più here .




Vai al tuo file Info.plist e apporta la modifica




Ho avuto lo stesso problema, 27 visualizzazioni nella mia applicazione, di cui 26 in verticale e solo uno in tutti gli orientamenti (un visualizzatore di immagini :)). Aggiungendo la macro su ogni classe e sostituendo la navigazione non era una soluzione che mi sentivo a mio agio con ...

Quindi, volevo mantenere la meccanica di UINavigationController nella mia app e non sostituirla con altri codici.

Cosa fare:

@ 1 Nell'applicazione delegato nel metodo didFinishLaunchingWithOptions

if ([[UIDevice currentDevice].systemVersion floatValue] < 6.0)
{
    // how the view was configured before IOS6
    [self.window addSubview: navigationController.view];
    [self.window makeKeyAndVisible];
}
else
{
    // this is the code that will start the interface to rotate once again
    [self.window setRootViewController: self.navigationController];
}

@ 2 Poiché il controller di navigazione risponderà solo con YES per l'autorotazione, è necessario aggiungere alcune limitazioni: Estendere UINavicationController -> YourNavigationController e collegarlo a Interface Builder.

@ 3 Ignora i "nuovi metodi anoying" dal controller di navigazione.

Poiché questa classe è personalizzata solo per questa applicazione, può assumersi la responsabilità dei suoi controllori e rispondere al loro posto.

-(BOOL)shouldAutorotate {

    if ([self.viewControllers firstObject] == YourObject)
    {
         return YES;
    }
    return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
     if ([self.viewControllers firstObject] == YourObject)
    {
         return UIINterfaceOrientationMaskLandscape;
    }
    return UIInterfaceOrientationMaskPortrait;
}

Spero che questo ti possa aiutare




Related