2014-12-30 9 views
21

Come progettare le schermate Paesaggio e Ritratto iPad con layout diversi utilizzando la classe Dimensioni. Sono riuscito a trovare solo w-regular e h-regular per entrambi gli orientamenti. Esempio: Ho bisogno di allineare 2 viste in verticale in verticale e in orizzontale nel paesaggio con dimensioni della ClasseLayout orizzontale e verticale per iPad Layout diversi con Classe di dimensioni

+1

per l'iphone è possibile crea 2 layout per diversi orientamenti usando la classe size. Come possiamo ottenere questo per iPad usando Size Class e Autolayout? –

+0

Hai trovato una soluzione? Ho lo stesso problema. – cmii

+3

In realtà questa è una domanda specifica. E nessuna Apple non ha progettato classi dimensionali per abilitare una classe di dimensioni specifiche per iPad, il che non ha assolutamente senso per me, dal momento che poi devi gestire manualmente l'orizzontale nel codice. Non sono d'accordo con alcuni degli approcci che incidono sul sistema delle classi di grandezza. Basta gestirlo nel codice. – n8tr

risposta

6

Finalmente ho trovato una soluzione:

if traitCollection.verticalSizeClass == .Regular && traitCollection.horizontalSizeClass == .Regular { 

    var orientation:UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation; 
    if orientation == UIInterfaceOrientation.LandscapeLeft || orientation == UIInterfaceOrientation.LandscapeRight { 
      // orientation is landscape 


    } else { 
      // orientation is portrait 

    } 
} 
6

sembra essere l'intenzione di Apple per il trattamento di entrambi gli orientamenti iPad come lo stesso - - ma come molti di noi stanno trovando, ci sono motivi di design molto legittimi per voler variare il layout dell'interfaccia utente per iPad Portrait vs. iPad Landscape.

Tuttavia, si prega di consultare questa risposta per un altro approccio per adeguare classi dimensionali di fare quello che ci serve: https://stackoverflow.com/a/28268200/4517929

+0

Sto sviluppando l'App universale, in cui ho provato il tuo approccio. ha funzionato bene per iPad ma quando ho impostato i vincoli per w: Any, h: Any I am getting ** Impossibile soddisfare simultaneamente i vincoli. ** errore –

5

Per Swift 3 sarebbe simile a questa:

override func overrideTraitCollection(forChildViewController childViewController: UIViewController) -> UITraitCollection? { 
    if UI_USER_INTERFACE_IDIOM() == .pad && 
     view.bounds.width > view.bounds.height { 

     let collections = [UITraitCollection(horizontalSizeClass: .regular), 
          UITraitCollection(verticalSizeClass: .compact)] 
     return UITraitCollection(traitsFrom: collections) 

    } 

    return super.overrideTraitCollection(forChildViewController: childViewController) 
} 

Si useranno wRhC invece di wRhR per dispositivi iPad in modalità orizzontale. Inserisci questo codice nel controller della vista di base, cioè questa regola funzionerà per tutti i controller presentati da questo. si può inserire qualsiasi condizioni aggiuntive qui ... Per esempio, se si desidera che la regola di poter lavorare solo per specifici controller della vista, il vostro se operatore sarebbe simile a questa:

if UI_USER_INTERFACE_IDIOM() == .pad && 
     childViewController is YourSpecificViewController && 
     view.bounds.width > view.bounds.height { 

     let collections = [UITraitCollection(horizontalSizeClass: .regular), 
          UITraitCollection(verticalSizeClass: .compact)] 
     return UITraitCollection(traitsFrom: collections) 

    } 
+1

È possibile che si verifichino conseguenze indesiderate. Ad esempio, se questo controller di visualizzazione mostra un altro controller di visualizzazione modale come un foglio modulo, verrà visualizzato come se fosse su un iPhone - a schermo intero in verticale - che probabilmente non è quello che desideri. Inoltre, mentre è aperto, se si ruota in orizzontale, tornerà allo schermo non intero e rimarrà in questo modo quando si ritorna al ritratto. Non è una piacevole esperienza. – Michael

Problemi correlati