Domanda

Sto sviluppando un'applicazione per iPhone che ha diversi pennini, e dovrebbero essere solo paesaggio.

L'applicazione è impostato per l'avvio in modalità orizzontale tramite il suo file Info.plist.

Ho due controller di vista: FirstViewController e SecondViewController.

Per ognuno di questi ho un file nib, dove la vista è nel paesaggio. Entrambi i controller di vista vengono aggiunti alla mia MainView pennino come punti vendita, e il loro parere sono pigramente inizializzati.

Quando l'applicazione carica, la prima vista mostra nel paesaggio, come previsto. Tuttavia, quando passo alla seconda vista, il dispositivo (o simulatore) rimane nel paesaggio, ma la vista è ruotata, come se il dispositivo fosse in modo verticale, frenata mia interfaccia.

In entrambe le classi UIViewController ho il seguente codice:

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

e per passare da una visualizzazione, nella mia app delegato che sto facendo:

[viewController.view removeFromSuperview];
[window addSubview:secondViewController.view];

dove viewController e secondViewController sono i due punti in cui sono collegati i controller di vista.

Questo è come il secondo punto di vista appare in IB: alt text http://img27.imageshack.us/img27/4898/picture1ni.png

e questo è come appare nel simulatore: alt text http://img402.imageshack.us/img402/4866/picture2wt.png

Perché è che il secondo punto di vista è la visualizzazione nel paesaggio, ma con l'interfaccia ruotato?

Non vorrei trattare con proprietà di trasformazione, dal momento che sembra eccessivo.

È stato utile?

Soluzione

I recitato questa domanda sperando che qualcuno darebbe una risposta perspicace e mi piacerebbe imparare qualcosa .. purtroppo ho paura che potrebbe essere necessario utilizzare le trasformazioni per ottenere questo per funzionare correttamente. Ecco il codice che ho usato di recente per risolvere il problema:

- (void)forceLandscapeForView:(UIView *)theView {
  theView.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
  theView.bounds = CGRectMake(0, 0, 480, 320);
  theView.center = CGPointMake(160, 240);
  [theView setNeedsLayout];
  [theView setNeedsDisplay];
}

Poi, quando si aggiunge la nuova visualizzazione, controllare l'orientamento attuale e, se necessario, la forza della rotazione:

if (!UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
  [self forceLandscapeForView:_activeViewController.view];
}

Poi, naturalmente, si vorrà rispondere in modo appropriato a shouldAutorotateToInterfaceOrientation in ciascuno dei vostri controller di vista:

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

Mi piacerebbe sentir parlare di soluzioni alternative, se questo non è affatto necessario. V'è anche un avvertimento che ho notato con questa configurazione: se si dispone di una transizione tra punti di vista, e si ruota il telefono durante quella transizione, è possibile che i punti di vista orientamenti per avere rovesciato o "bloccato" sulla orientamento orizzontale sbagliato, come ad che è necessario accendere il telefono over (paesaggio-destra vs paesaggio-sinistra) durante la navigazione tra i punti di vista.

Altri suggerimenti

è solo un suggerimento, ma si può cercare di tornare NO nel metodo shouldAotorotate per il secondo punto di vista. O cercare di farlo nella vista ritratto in IB. La tua opinione è stata caricata correttamente (in modalità orizzontale), ma poi ha ricevuto un messaggio shouldAutorotate ed era stato ruotato di 90 gradi.

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