Domanda

Vedo che questo è qualcosa che ha preoccupato molte persone:/

Ho un UitabbarController che ha 4 ViewController, tutti di tipo UinavigationController. Uno dei conflitti di navigazione riceve un ViewController spinto sul suo stack, questo ViewController dovrebbe essere presentato in modalità/orientamento del paesaggio.

ViewController è un grafico, è assolutamente solo nell'app in cui ha senso il paesaggio. (Nascondo l'Uitabbar quando questo viene presentato per non portare l'utente a credere che funzionerà ovunque)

Per fare in modo che un UitabbarController risponda correttamente alle modifiche all'orientamento, tutti i suoi ViewController devono restituire lo stesso valore dal metodo delegato:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Quindi, per soddisfare questo comportamento ho implementato questo metodo in tutti i ViewController appartenenti all'UitabbarController:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    BOOL canRotate = [defaults boolForKey:@"can_rotate"];

    return canRotate;
}

Il "trucco" è ora che quando viene spinto il mio canale di paesaggio canatico, lo faccio: lo faccio:

- (void) viewWillAppear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:YES forKey:@"can_rotate"];
    [defaults synchronize];

}

E quando è scoppiato, lo faccio:

- (void) viewWillDisappear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:NO forKey:@"can_rotate"];
    [defaults synchronize];

}

Funziona davvero bene. Quando il ViewController è sullo stack, posso ruotare il dispositivo e la vista segue.

Il problema è tuttavia che se l'utente tocca il pulsante "schiena" sulla barra di navigazione mentre è in modalità paesaggio, facendo così scoppiare ViewController al precedente ViewController, questo "vecchio" ViewController è ovviamente anche in modalità paesaggio. A peggiorare le cose, perché ho impostato il bool su NO, questo "vecchio" ViewController non può ruotare quando mi orienta il dispositivo alla modalità di ritratto.

C'è un modo per aggiornare tutto in modo che nessuno dei miei altri ViewController sia in modalità paesaggio quando faccio scoppiare il berrettiera in modalità di terra?

Sono un po 'preoccupato che se questo potesse essere fatto dal paesaggio al ritratto, dovrebbe essere possibile anche da un ritratto a paesaggio, rendendo così il mio "hack" inutile ... ma se non può, allora sono tornato a Square One:/

Spero di essere vicino e che qualcuno possa aiutarmi ad arrivarci, grazie :)

È stato utile?

Soluzione

penso di poter semplificare il tutto ....

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

-(void) viewDidAppear:(BOOL)animated { [UIView beginAnimations:@"View Flip" context:nil]; [UIView setAnimationDuration:0.5f]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(90.0*0.0174532925);
    self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
    self.view.center = CGPointMake(160.0f, 240.0f);

// [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight;

[UIView commitAnimations];
[super viewDidAppear:animated];

}

ruota auto niente, ma poi ruotare manualmente la vista desiderata mosso. Se non è necessario il supporto della tastiera nella vista non è necessario cambiare lo statusBarOrientation.

Se non si desidera sempre quella vista ruotata allora avete un problema leggermente più difficile - si potrebbe desiderare di controllare i valori accelerometro per capire in che modo il giro del telefono è (o potrebbe essere possibile implicare che modo il telefono è stata trasformata da chiamate verso shouldAutotateToInterfaceOrientation e poi basta chiamare il codice di trasformare, come e quando è necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top