Swift – Usare i constraint creati da Storyboard via codice
Apple • Programmazione • Swift
Se anche voi, come me, fate uso intenso di Interface Builder, Xib e Storyboard
vi sarete accorti che su xCode manca un metodo per poter riferirsi ad un constraint specifico a meno di non utilizzare @IBOutlet
per ogni singolo elemento.
La cosa che più mi disturba è il non poter avere dei riferimenti a quelle proprietà molto utili come la dimensione o la posizione di una View. Mi spiego.
Prima di Autolayout
potevamo semplicemente scrivere una cosa del genere (ipotetica):
view.height = 100 view.width = 200
Adesso invece se dobbiamo modificare la dimensione di una View dobbiamo prima creare i constraint, poi connetterli con @IBOutlet
e infine possiamo modificarli. Proprio per il concetto di Autolayout
è giusto che sia così ma tutti questi passaggi li ritengo troppo lunghi e quindi ho cercato una soluzione più comoda.
Ogni NSLayoutContraint
ha un Identifier
, quindi è possibile cercare e trovare il contraint assegnando un semplice identificativo da Interface Builder
.
UIView
ha un proprietà : .constraint
che include tutti quelli assegnati, quindi possiamo ciclare e cercarne uno specifico.
Però non basta, perché specifici constraint non stanno all’interno della View al quale sono assegnati ma alla View genitore.
Prendiamo come esempio una UIView
chiamata “container”. Se agganciamo un constraint Top
, quest’ultimo sarà  inserito nella superview
.
Quindi è necessario ricercare i constraint in modo più intelligente, andando a interrogare sia le view che le subviews
.
Ho creato una extension di UIView
che ci permette di fare tutto questo in modo semplice, ma non solo, ho creato un sistema predefinito di chiavi da utilizzare nel nostro progetto: top, bottom, leading, trailing, height, width, xAlign, yAlign
. Ed è possibile accedere direttamente a tutti questi constraint tramite delle semplici proprietà .
Il progetto è su GitHub e si chiama StroryboardConstraint. Sono benvenute tutte le critiche e i suggerimenti.
Utilizzarlo è molto semplice, basta includere la extension nel progetto, assegnare gli identificativi tramite Interface Builder
e poi accedere alle proprietà :
customView.heightConstraint?.constant = 200 customView.topConstraint?.constant = 20
Si può anche accedere ad un constraint con un identificativo specifico:
view.constraint(withIdentifier: "customWidth", searchInSubviews: true)?.constant = 50
[EDIT]
Ho appena aggiornato la libreria. Adesso non c’è più bisogno di configurare alcun identifier. L’estensione è in grado di riconoscere automaticamente il constraint richiesto.
Inoltre ho aggiunto un nuovo metodo per avere tutti i constraint di un certo tipo ordinati per priorità :
view.constraints(withAttribute: .height)
Spero apprezziate e non esitate a inviarmi i vostri commenti!