2013-08-13 15 views
26

Layout automatico, per quanto buono, mi fa impazzire con i vincoli. Ho la modalità ritratto progettata in IB ma non riesco a far funzionare l'orientamento orizzontale desiderato.Lavorare con AutoLayout in verticale e orizzontale

layout

noti che quando cambia orientamento orizzontale, la spaziatura tra i blocchi UIImageView diminuisce e l'allineamento del testo di SAMPLE TEXT modifiche allineato a destra.

Attualmente, ho aggiunto alcuni vincoli per farlo funzionare. Tuttavia, ho bisogno di mantenere fisso lo spazio tra i blocchi UIImageView, in conseguenza del quale appare angusto in verticale e benissimo in orizzontale. Ho bisogno che sia distribuito uniformemente in verticale e compresso in orizzontale (come nell'immagine sopra). Allo stesso modo, attualmente i miei vincoli sollevano il testo ma non lo tengono al centro dello schermo e allineato a destra.

Ciò è possibile con Layout automatico? Se é cosi, come? Aiuto molto apprezzato.

+0

Per ottenere spaziature flessibili, è possibile utilizzare le seguenti domande: http://stackoverflow.com/questions/17089427/ios-autolayout-vertically-equal-space-to-fill-parent-view e http://stackoverflow.com/ questions/13680303/ios-auto-layout-equal-spaces-to-fit-superviews-width – Mikhail

+0

Per giocare con il vincolo di viste su runtime, questo sarà utile [Modifica di runtime in Autolayout] (http://stackoverflow.com/questions/27414052/moving-views-with-constraints/27420696 # 27420696) – Kampai

risposta

12

Ci sono molti modi per avvicinarsi a questo. Un modo è quello di racchiudere le 3 viste dell'immagine in un UIView. Assegnare rispettivamente i vincoli delle viste delle immagini in alto e in basso rispettivamente in alto e in basso e assegnare a quello centrale un vincolo centerY. Assegna a questa vista acclusa un'altezza e una larghezza fisse e un vincolo nella parte superiore della vista del controller. Fai un IBOutlet al vincolo di altezza per questa vista che lo racchiude e cambialo a rotazione. Nell'esempio che segue, ho dato un'altezza di 350 nel ritratto:

-(void)updateViewConstraints { 
    [super updateViewConstraints]; 
    if (self.view.bounds.size.height < self.view.bounds.size.width) { 
     self.heightCon.constant = self.view.bounds.size.height; 
    }else{ 
     self.heightCon.constant = 350; 
    } 
} 

Per quanto riguarda l'etichetta, il modo più semplice è quello di rimuovere i vincoli che avete (in basso e centerX), e aggiungere trailing e centerY a rotazione .

+0

Sembra buono. Tuttavia, la mia vista non risponde a - (void) willAnimateRotationToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation duration: (NSTimeInterval) duration..Io ho provato NSLog-ging su 'interfaceOrientation' ma non viene visualizzato nulla sull'output..So ho registrato per la notifica di orientamento del dispositivo ma che rende l'animazione lenta .. sai perché la vista non risponde al metodo che hai citato –

+0

@GauravWadhwani, non so perché non si chiamerebbe. Ho cambiato il mio post per inserire il codice in updateConstraints. Vedi se funziona. – rdelmar

+0

Funziona, grazie mille !!! Ho trascorso tutta la giornata su questo. Aggiungerà solo i blocchi e segnerà la risposta in un attimo. Grazie ancora :) –

2

Sì, è sicuramente possibile farlo con Auto Layout. Attraverso una serie di passaggi, che ritengo possano essere troppo lunghi per pubblicare una risposta, puoi mantenere la spaziatura tra le tue ImageViews e mantenere l'allineamento del testo allo stesso modo.

In sostanza, è necessario appuntare un angolo di ogni ImageView e rimuovere alcuni vincoli in modo che non comprimano automaticamente la spaziatura quando si modifica l'orientamento.

Spiegazione completa su come eseguire questa operazione (praticamente esattamente ciò che si richiede) is explained in this tuorial. Puoi trovarlo a circa metà pagina.

Spero che questo sia quello che stavi cercando.

+0

Ehi, attualmente la compressione e l'allineamento del testo non cambiano.Voglio che lo spazio comprimi e l'allineamento del testo per cambiare .. –

+0

Hai provato il link che ho dato? Quale spazio vuoi comprimere? Dalla tua domanda sembra che tu non li desideri compressi in orizzontale. Li vuoi veramente compressi? – CaptJak

+0

Sì, voglio che i blocchi siano distanziati in Portrait e compressi in orizzontale in modo che si adattino al modo mostrato nell'immagine. Ho provato il collegamento in precedenza ma non ho potuto risolvere il problema. Leggerò di nuovo però :) –

6

Sì, può essere eseguito con Layout automatico. Se si desidera che la spaziatura tra le viste aumenti e/o diminuisca a seconda dell'orientamento, è possibile utilizzare la relazione Minore o Uguale o Maggiore o uguale (anziché Equal) per il vincolo, che consente a una distanza di aumentare o diminuire:

enter image description here

Giocare con questo e si dovrebbe essere in grado di ottenere quello che vuoi.

+0

Grazie per la risposta. Ho provato a modificare questo vincolo. Ma non appena lo cambio in qualcosa di diverso da "Uguale a", mi dà ambiguo avvertimento di layout per il posizionamento orizzontale. –

+0

Avrete bisogno di aggiungere altri vincoli in alto e in basso 'UIImageView' in modo che usando <= or > = nei vincoli tra loro non sia ambiguo. – mluisbrown

+0

Ho bisogno che la posizione di UIImage sia variabile in verticale, quindi qualunque sia il vincolo che aggiungo, è sotto forma di <= or =>. Ma xcode si aspetta che aggiunga almeno un vincolo per il verticale che è stato corretto. Come posso aggiungere un vincolo fisso e mantenerlo flessibile? –

Problemi correlati