2010-09-24 7 views
5

Ho una situazione, ho creato due diversi pennini, uno in modalità verticale e altri in modalità orizzontale. Avevo molti disegni in vista, quindi ho dovuto optare per due pennini diversi. Ora, voglio passare i pennini come interfaccia ruota nelDesidero utilizzare pennini multiplo per diversi orientamenti di interfaccia iphone

viewController comune

modo che possa mantenere i valori inseriti e lo stato dei controlli che ho nella vista.

In questo momento sto usando

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Override to allow orientations other than the default portrait orientation. 
if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight){ 
    [self initWithNibName:@"LandscapeNib" bundle:nil]; 
}else if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){ 
    [self initWithNibName:@"PortraitNib" bundle:nil]; 

} 


return YES; 

}

ma non cambia il pennino, mostra il pennino caricato iniziale. Posso supporre che si stia caricando ma non venga mostrato perché il pennino iniziale sta già mostrando, non viene rimosso. Non riesco a trovare la soluzione per lavorare con pennini multipli con un controller di visualizzazione comune in modo da poter gestire facilmente la funzionalità dei controlli?

risposta

2

Non è possibile iniziare di nuovo da sé una volta che il sé è già stato inizializzato.

Quando si ruota, si avrà bisogno di:

  1. Usa loadNibNamed:owner:options: al carico il pennino a mano in un NSArray. (Vedi the documention).
  2. Impostare self.view sull'oggetto all'indice 0 di quella matrice.
+0

Anche se ciò potrebbe funzionare, non è consigliabile sostituire la vista del controller. Sembra sporco, introducendo situazioni fragili in cui diventa facile commettere errori nel rilasciare e conservare correttamente gli oggetti. – Michal

+0

In realtà, la sostituzione della vista dei controller sarà molto migliore se si prevede che l'utente ruoti nuovamente il dispositivo. Non usa molta memoria, più la rotazione sarà più veloce. Inoltre, se entrambe le viste sono oggetti di classe, possono essere deallocati e rilasciati con il controller di visualizzazione. – MishieMoo

5

shouldAutorotateToInterfaceOrientation: deve semplicemente tornare con un SÌ o un NO. Secondo la mia esperienza, non è una buona idea eseguire qui un'elaborazione estesa. Dalla documentazione:

L'implementazione di questo metodo dovrebbe semplicemente restituire SI o NO basa sul valore nel parametro interfaceOrientation. Non provare per ottenere il valore della proprietà interfacciaOrientation o controllare il valore di orientamento riportato dalla classe UIDevice . Il controller di visualizzazione è in grado di supportare un orientamento dato o non lo è.

Un posto migliore per caricare il tuo pennini in risposta ad una rotazione del dispositivo sarebbe

willRotateToInterfaceOrientation:duration: o didRotateToInterfaceOrientation:

6

Si dovrebbe creare una speciale view-controller per la modalità orizzontale, e presentarlo in modo modale quando il dispositivo ruota. Per ricevere una notifica quando il dispositivo ruota, registrati per le notifiche UIDeviceOrientationDidChangeNotification.

Per visualizzazioni così complesse che devono essere presentate in modo diverso in verticale e orizzontale, questo è consigliato per implementarlo da Apple.Leggi qui per maggiori dettagli:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html#//apple_ref/doc/uid/TP40007457-CH101-SW26

Ecco un frammento dalla documentazione di Apple. Registrazione per le notifiche nella vostra init o awakeFromNib:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
          selector:@selector(orientationChanged:) 
          name:UIDeviceOrientationDidChangeNotification 
          object:nil]; 

e nel orientationChanged presentare il vostro paesaggio view-controller modale, o respingere, tutto secondo le rotazione corrente:

- (void)orientationChanged:(NSNotification *)notification 
{ 
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && 
     !isShowingLandscapeView) 
    { 
     [self presentModalViewController:self.landscapeViewController 
           animated:YES]; 
     isShowingLandscapeView = YES; 
    } 
    else if (deviceOrientation == UIDeviceOrientationPortrait && 
      isShowingLandscapeView) 
    { 
     [self dismissModalViewControllerAnimated:YES]; 
     isShowingLandscapeView = NO; 
    } 
} 
-2

avevo bisogno di fare lo stesso per la mia applicazione e alla fine ho terminato con una specifica classe UIAutoRotateView che gestirà quella per te.

leggere la spiegazione here

Spero che questo aiuti.

+1

Le risposte che contengono solo collegamenti sono [considerate pratiche sbagliate] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). Si prega di riassumere il contenuto qui (non copiare/incollare) in modo che la risposta possa reggersi da sola. Se non lo fai, corri il rischio che la tua risposta venga rimossa, soprattutto se il collegamento muore mai. Inoltre, si prega di rivedere la [promozione faq #] sul collegamento al proprio blog. –

Problemi correlati