Introducere în limbajul Visual Format

Auto Layout a fost disponibil de câțiva ani, dar cu iPhone 6 și 6 Plus a devenit o necesitate pentru proiecte. Deși nu a fost întotdeauna foarte ușor de folosit, Xcode a văzut în mod constant îmbunătățiri în Interface Builder pentru a simplifica integrarea Auto Layout. În acest tutorial, veți învăța cum să utilizați Visual Format Language folosind Swift pentru a crea constrângeri Auto Layout în cod.

1. Introducere

Acest tutorial presupune că aveți cunoștințe despre Auto Layout. Dacă sunteți noul Auto Layout, vă recomand să citiți mai întâi introducerea de către Joyce Echessa.

Visual Format Language este un limbaj declarativ care este utilizat pentru a defini constrângerile Auto Layout pentru vizualizări. Sintaxa sa este expresivă și ușor de înțeles când scanezi prin cod. Constrângerile intenționate ar trebui să fie imediat limpezi la citirea unei instrucțiuni de limbă Visual Format și acestea curg mult ca o propoziție.

Constrângerile de auto-dispunere cu priorități diferite, layout-uri verticale, spațiere și dimensiuni pot fi create folosind sintaxa Visual Format Language. Este definit în interiorul unei variabile de șir și apoi trecut la metodele de nivel de clasă constraintsWithVisualFormat: opțiuni: valori: puncte de vedere: și
 constraintWithItem: atribut: relatedBy: toItem: atribut: multiplicator: constanta: din NSLayoutConstraint clasă.

Limba Visual Format poate fi utilă în mod special atunci când Interface Builder nu este o opțiune pentru a adăuga constrângeri Auto Layout, de exemplu când o parte din interfața de utilizator a aplicației trebuie să fie creată programabil.

2. Crearea unui nou proiect

Să creați un nou proiect în Xcode pentru a vedea cum se utilizează Visual Format Language și cum pot beneficia proiectele dvs..

Pasul 1: Șablon de proiect

Deschideți Xcode și selectați Nou> Proiect ...  de la Fişier meniul. Alege Vizualizare individuală din lista de Aplicația iOS șabloane și faceți clic pe Următor →.

Pasul 2: Configurarea proiectului

Apoi denumiți proiectul și introduceți numele și identificatorul organizației. Alege universal de la Dispozitive listă, faceți clic pe Următor →, și alegeți o locație pentru a salva proiectul. Selectați Rapid ca limbaj de programare.

3. Crearea unei constrângeri pentru o singură vizualizare

Pasul 1: Definiți variabilele

Pentru a începe, creați trei variabile de tip UIView. Deschis ViewController.swift și adăugați următorul cod deasupra viewDidLoad metodă:

var vwBlue: UIView! var vwRed: UIView! var vwGreen: UIView!

Pasul 2: Inițializarea vizualizărilor

Creați o funcție numită initViews în partea inferioară a controlerului de vizualizare vid ca tip de retur. Această funcție va inițializa vizualizările și le va adăuga în ierarhia de vizualizare. Asigurați-vă că ați apelat la această funcție viewDidLoad după ce a sunat la superclass viewDidLoad metodă.

() vwGreen = UIView () vwGreen = UIView () // Prep auto layout vwRed.setTranslatesAutoresizingMaskIntoConstraints (false) vwBlue.setTranslatesAutoresizingMaskIntoConstraints (false) vwGreen.setTranslatesAutoresizingMaskIntoConstraints (false) / / Colorarea vwRed.backgroundColor = UIColor.redColor () vwBlue.backgroundColor = UIColor.blueColor () vwGreen.backgroundColor = UIColor.greenColor () // Adăugați-i la vizualizare self.view.addSubview (vwRed) self.view.addSubview ( vwBlue) self.view.addSubview (vwGreen) 

Când utilizați Auto Layout pentru vizualizările create în cod, există câteva avertismente care trebuie să fie cunoscute. Primul este legat de valoarea proprietății translatesAutoresizingMaskIntoConstraints. Această proprietate este Adevărat în mod implicit, ceea ce înseamnă că constrângerile Auto Layout vor fi create pe baza vizualizărilor masca de autorezonare. Vrem ca vizualizarea să respecte constrângerile Auto Layout pe care le vom adăuga, astfel încât această proprietate să fie setată la fals.

Al doilea lucru pe care trebuie să-l țineți cont este ciclul de viață al vederii. Înainte de a putea fi adăugate constrângeri Auto Layout la o vizualizare, acestea trebuie adăugate la superview. În caz contrar, este aruncată o excepție de rulare. Amintiți-vă că Auto Layout definește unde sunt afișate vederile pe baza relațiilor. Dacă o vizualizare nu are supervizare, sistemul de operare nu are niciun punct de referință pentru a lega constrângerile Auto Layout la.

Pasul 3: Creați constrângerile pentru o singură vizualizare

Să începem cu un exemplu simplu al limbajului Visual Format. Pentru vizualizarea roșie, vwRed, vom adăuga constrângeri Auto Layout care o fac la aceeași dimensiune ca și supravegherea. Acest lucru este util într-un scenariu în care adăugați o imagine de fundal.

Înainte de a putea fi utilizat limbajul Visual Format, toate punctele de vedere de care avem nevoie trebuie să fie menționate în interiorul unui dicționar. Acesta este modul în care vizualizările vor fi identificate de Visual Language Format.

Creați o funcție numită createConstraints cu vid retur în partea inferioară a clasei controlerului de vizualizare. Nu vă faceți griji cu privire la sintaxa. Vom revizui implementarea createConstraints funcționează într-un moment.

()), () () () () () () () (), pentru a adăuga constrângeri pentru a permite vizualizărilor = Dicționar (dicționarLiteral: "roșu", vwRed) permiteți verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat ("H: | [red] |", opțiuni: nil, metrics: nil, vizualizări: vizualizări) self.view.addConstraints (horizontalConstraints) // constrângeri verticale let verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat : | [red] | ", opțiuni: nil, valori: nil, vizualizări: vizualizări) self.view.addConstraints (verticalConstraints)

Pasul 4: Construiți și executați

Apelați această funcție la sfârșitul secțiunii initViews pe care am creat-o mai devreme. Construiți și executați proiectul apăsând Command + R sau făcând clic pe butonul de redare din partea stângă sus. Simulatorul iOS va rula să afișeze imaginea roșie, preluând tot ecranul conform destinației dorite.

4. Analizarea sintaxei limbajului Visual Format

Când utilizați limbajul Visual Format, constrângerile Auto Layout sunt definite fie orizontal, fie vertical. De asemenea, puteți defini înălțimea sau lățimea unei vizualizări atunci când declarați o constrângere verticală și orizontală. Să aruncăm o privire mai atentă la primul șir pe care l-am folosit pentru a crea constrângerea orizontală.

"H: | [red] |"

În primul rând, identificăm că aceasta va fi o constrângere orizontală prin începerea șirului cu litera H. Orizontul este implicit, dar este o practică bună să o includeți pentru ao face mai evidentă. Direcția constrângerii este urmată de un colon.

| sau simbolul conductei simbolizează supravegherea vizualizării. Pentru a adăuga spațiu între două elemente, - sau simbolul dash și valorile întregi pot fi plasate între ele pentru a crea un spațiu fix sau variabil. Viziunile sunt menționate de către tastele din dicționarul transmis constraintsWithVisualFormat. Fiecare vizualizare este înfășurată în paranteze pătrate.

Observați cum șirul întreg se potrivește vizibil cu imaginea din simulator. Este scris ca o propoziție care ar citi ceva de genul "Orizontal, vizualizarea roșie ar trebui să extindă întreaga lățime a supraveghierii sale fără umplutură".

5. Crearea constrângerilor pentru vizualizări multiple

Acum că aveți o înțelegere de bază a sintaxei, o vom edita createConstraints funcția de adăugare a constrângerilor de tip Auto Layout la două vizualizări.

Pasul 1: Editați Condiția orizontală 

În createConstraints funcția, editați horizontalConstraints variabilă după cum se arată mai jos.

// Constrângerile orizontale permit horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat ("H: | -10- [roșu (> = 100,<=200)]-0-[blue(==red)]-10-|", options: nil, metrics: nil, views: views) self.view.addConstraints(horizontalConstraints)

Acest fragment de cod arată cu adevărat flexibilitatea limbajului Visual Format. Instrucțiunea de mai sus creează pentru noi un număr de constrângeri Auto Layout. Lângă numele vizualizării, dimensiunile orizontale sunt definite în paranteze. Pentru vizualizarea roșie, dimensiunea trebuie să fie mai mare sau egală cu 100 de puncte, dar mai mică sau egală cu 200 de puncte.

Vederea albastră specifică faptul că ar trebui să aibă aceeași dimensiune orizontală ca și imaginea roșie prin utilizarea == roșu în paranteze. Acesta este un mod convenabil de a specifica că mai multe vizualizări ar trebui să aibă aceeași dimensiune. Construiți și rulați aplicația în Simulatorul iOS. Rezultatul ar trebui să arate imaginea de mai jos.

Pasul 2: Adăugarea priorităților

Cu aplicația care rulează în Simulatorul iOS, apăsați Comandă + Săgeată stânga pentru a modifica orientarea simulatorului iOS pe peisaj. În timp ce aplicația continuă să funcționeze bine, a apărut un avertisment în consola Xcode. Avertismentul ne spune că anumite constrângeri privind aspectul automat nu pot fi satisfăcute. Deși acest lucru nu vă va afecta aplicația, aceasta poate duce la rezultate neașteptate în interfața de utilizare a aplicației.

Acest lucru se întâmplă deoarece cele două vederi pe care le-am creat nu pot avea o lățime de 200 de puncte și nu au distanțe între ele atunci când dispozitivul sau simulatorul iOS se află în peisaj. Aspectul automat rezolvă aceste tipuri de scenarii utilizând prioritățile. Limba Visual Format vă permite să definiți prioritățile utilizând @ simbol. Editați horizontalConstraints variabilă pentru a citi astfel:

// Constrângerile orizontale permit horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat ("H: | -10- [roșu (> = 100,<=200@20)]-0-[blue(==red)]-10-|", options: nil, metrics: nil, views: views)

Deoarece vederile roșu și albastru au acum o prioritate scăzută asupra constrângerii lor de lățime, indicată prin @ 20, sistemul Auto Layout va întrerupe aceste constrângeri și le va furniza valoarea corectă la timpul de execuție. Rulați din nou aplicația și modificați orientarea pe peisaj. Vizualizările acum umple spațiul suplimentar și Xcode nu produce nici o avertizare.

Pasul 3: Adăugarea constrângerilor la vizualizarea din partea inferioară

Apoi, vom crea constrângeri pentru vizualizarea verde. Actualizați punerea în aplicare a createConstraints după cum se arată mai jos.

()), () () () () () () () (), pentru a adăuga constrângeri pentru a permite vizualizărilor = Dicționar (dicționarLiteral: "roșu", vwRed) permiteți horizontalConstraintsRedBlue = NSLayoutConstraint.constraintsWithVisualFormat ("H: | -10- [roșu (> = 100,<=200@20)]-0-[blue(==red)]-10-|", options: nil, metrics: nil, views: views) self.view.addConstraints(horizontalConstraintsRedBlue) let horizontalConstraintsGreen = NSLayoutConstraint.constraintsWithVisualFormat("H:|[green]|", options: nil, metrics: nil, views: views) self.view.addConstraints(horizontalConstraintsGreen) //Vertical constraints let verticalConstraintsRed = NSLayoutConstraint.constraintsWithVisualFormat("V:|[red]-10-[green(40)]|", options: nil, metrics: nil, views: views) self.view.addConstraints(verticalConstraintsRed) let verticalConstraintsBlue = NSLayoutConstraint.constraintsWithVisualFormat("V:|[blue]-10-[green(40)]|", options: nil, metrics: nil, views: views) self.view.addConstraints(verticalConstraintsBlue) 

Deoarece horizontalConstraintsGreen constrângerea nu definește o anumită lățime sau distanțe față de supravegherea sa, va acoperi întreaga lungime. Constrângerea verticală asigură o înălțime de 40 de puncte cu 10 puncte de spațiu între vizualizările roșu și albastru.

Dacă rulați aplicația încă o dată, vizualizarea verde se întinde pe toată lățimea ecranului, iar vizualizările roșu și albastru rămân deasupra acestuia, așa cum au fost înainte. Când simulatorul iOS este rotit pe peisaj, vizualizările își păstrează poziția și se redimensionează corespunzător.

Pasul 4: Adăugarea de valori

Pentru a face totul mai ușor de citit, vom folosi un dicționar de valori în declarațiile de constrângeri. Creați un dicționar după cum se arată mai jos, imediat după ce ați declarat vizualizari dicţionar.

permiteți metricilor = dicționar (dicționarLiteral: ("spațiere", 10), "lowWidth", 100), "highwidth", 200) “, 40))

Acum, în loc să folosim valorile codate greu, putem folosi valorile valori dicționar, ceea ce face declarațiile constrângerilor mult mai ușor de citit. Editați createConstraints funcționați ultima dată utilizând noua funcție valori dicţionar.

func createConstraints () -> Void // Vizualizări pentru a adăuga constrângeri pentru a permite vizualizări = Dicționar (dicționarLiteral: ("roșu", vwRed), ("albastru", vwGreen) Fișierul Visual Format permite metrics = dicționar (dicționarLiteral: ("spațiere", 10), "lowwidth", 100), "highwidth", 200), "redBlueSpacing" ("greenHeight", 40)) // Constrângerile orizontale permit horizontalConstraintsRedBlue = NSLayoutConstraint.constraintsWithVisualFormat ("H: | -spacing- [red (> = lowWidth,<=highWidth@priority)]-redBlueSpacing-[blue(==red)]-spacing-|", options: nil, metrics: metrics, views: views) self.view.addConstraints(horizontalConstraintsRedBlue) let horizontalConstraintsGreen = NSLayoutConstraint.constraintsWithVisualFormat("H:|[green]|", options: nil, metrics: nil, views: views) self.view.addConstraints(horizontalConstraintsGreen) //Vertical constraints let verticalConstraintsRed = NSLayoutConstraint.constraintsWithVisualFormat("V:|[red]-spacing-[green(greenHeight)]|", options: nil, metrics: metrics, views: views) self.view.addConstraints(verticalConstraintsRed) let verticalConstraintsBlue = NSLayoutConstraint.constraintsWithVisualFormat("V:|[blue]-spacing-[green(greenHeight)]|", options: nil, metrics: metrics, views: views) self.view.addConstraints(verticalConstraintsBlue) 

6. Limitările limbajului Visual Format

S-ar putea să te întrebi de ce înălțimea vederii verde a fost definită de două ori. Acest lucru se datorează faptului că Visual Format Language funcționează în rânduri și coloane. Când utilizați Visual Format Language, gândiți-vă la adăugarea constrângerilor de la stânga la dreapta pe un "rând" al vizualizării pentru constrângeri orizontale. Pentru constrângerile verticale, trebuie să gândiți în termeni de coloane.

Majoritatea constrângerilor de auto dispunere pe care le veți folosi pot fi exprimate cu Visual Language Format. Există însă câteva care nu pot. De exemplu, o constrângere a raportului de aspect fix nu poate fi creată utilizând Visual Language Format. Acest lucru nu poate fi realizat cu sintaxa Visual Format Language, deoarece șirul următor nu poate fi analizat:

H: | imagineView.width = 2 * imagineView.height |

Puteți utiliza în continuare Auto Layout în codul dvs. pentru a realiza aceste tipuri de constrângeri utilizând metoda tradițională constraintWithItem metodă.

Concluzie

Limba Visual Format poate fi foarte utilă atunci când trebuie să creați constrângeri Auto Layout în cod. În loc să creați constrângeri unul câte unul, Visual Language Language vă permite să creați un număr de constrângeri cu o singură linie de cod.

Înainte ca dezvoltatorii să fie disponibili pentru Auto Layout, urmărirea modului de redimensionare a vederilor pentru diferite categorii de dispozitive a fost o mulțime de lucruri. Cu Auto Layout și Visual Format Language, acest lucru este acum mai intuitiv, făcând interfețele utilizatorilor mai ușor de întreținut pe toate dispozitivele.

Cod