2014-07-12 22 views
7

Ho diversi UIView s disposti lungo la parte inferiore di una contenente UIView. Voglio che queste viste siano sempre di uguale larghezza e tendano sempre a riempire collettivamente la larghezza della vista contenente (come i pulsanti della tastiera emoji in basso). Il modo in cui sto avvicinando è impostare larghezze uguali a una delle viste, quindi solo aggiornare il vincolo di larghezza che guarda essere superviewWidth/numberOfViews che causerà tutte le altre viste per aggiornare a tale valore stesso.Dove aggiornare i vincoli di Autolayout quando le dimensioni cambiano?

Mi chiedo dove il codice per modificare il vincolo bisogni costanti per andare. Deve essere impostato prima che la tastiera venga visualizzata sullo schermo per la prima volta e aggiornata quando si ruota il dispositivo.

Il mio primo tentativo di soluzione è stato inserirlo in updateViewConstraints e calcolare la larghezza tramite containerView.frame.size.width. Ma questo metodo viene chiamato due volte al caricamento, la prima volta che calcola i valori correttamente, ma la seconda volta per qualche motivo la larghezza dello containerView è 0.0. Un altro problema è che quando si ruota, la larghezza dello containerView non è il valore che sarà dopo la rotazione, è il valore corrente prima della rotazione. Ma non voglio aspettare fino a dopo che la rotazione è stata completata per aggiornare il vincolo, perché i pulsanti saranno la dimensione originale, quindi cambierà il che sarà stridente per l'utente.

La mia domanda è: dove è il posto più adatto per mettere questo codice? C'è un modo migliore per calcolare quale sarà la larghezza? Posso garantire che sarà sempre la stessa larghezza della larghezza dello schermo. E sto usando le classi di dimensioni in Xcode 6, quindi willRotateToInterfaceOrientation e metodi simili sono deprecati.

risposta

2

Non v'è alcun motivo per aggiornare manualmente la larghezza:

  1. Mettere tutti i punti di vista con uguale larghezza nella vista senza spaziatura tra loro
  2. Aggiungi un vincolo larghezza uguale a tutti loro
  3. Aggiungere vincoli con larghezza 0 per spaziatura tra i lati e tra loro
  4. Ridurre la priorità di uno o più vincoli di larghezza uguale nel caso in cui la larghezza non possa essere divisa in parti uguali.

Poi layout automatico si occuperà di tutto per voi.

+0

Grazie per aver suggerito una soluzione migliore! Funzionando meravigliosamente – Joey

8

Su tutte le classi che implementano il protocollo UITraitEnvironment, il metodo traitCollectionDidChange verrà chiamato quando la raccolta di tratti cambia, come a rotazione. Questa è la posizione appropriata per aggiornare manualmente i vincoli quando si utilizzano le nuove classi di dimensione. È inoltre possibile animare la transizione con il metodo willTransitionToTraitCollection

Esempio di base:

class ViewController: UIViewController { 

    var constraints = [NSLayoutConstraint]() 

    func updateConstraintsWithTraitCollection(traitCollection: UITraitCollection) { 
    // Remove old constraints 
    view.removeConstraints(constraints) 

    // Create new constraints 
    } 

    override func willTransitionToTraitCollection(newCollection: UITraitCollection!, 
    withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator!) { 

     super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator: coordinator) 

     coordinator.animateAlongsideTransition({ (context: UIViewControllerTransitionCoordinatorContext!) in 
     self.updateConstraintsWithTraitCollection(newCollection) 
     self.view.setNeedsLayout() 
     }, completion: nil) 

    } 

    override func traitCollectionDidChange(previousTraitCollection: UITraitCollection!) { 
    updateConstraintsWithTraitCollection(traitCollection) 
    } 
} 

Oltre che voglio raccomandare Cartografia, che è una bella libreria che aiuta a rendere il layout automatico più leggibile e piacevole. https://github.com/robb/Cartography

+0

Grazie, sono sicuro che questo sarà utile anche se ho implementato la soluzione di Drewag. – Joey

+0

Sei un risparmiatore di vita. Questo è dove finalmente vedo e rimuovo i vincoli 'fantasma' che non sono riuscito a trovare tramite UIView.constraints() a ViewDidLoad() e quando si intercetta un orientamento dello schermo willRotateToInterfaceOrientation(). – clearlight

Problemi correlati