de Yuichi Fujiki

În acest articol, veți afla cum să creați un aspect personalizat unificat în toată aplicația dvs. cu aceste trucuri simple.

Ce vrem să facem

În iOS, există un mecanism numit UIAppearance pentru a defini configurația globală a unei aplicații. De exemplu, puteți seta o culoare de fundal consistentă a barei de navigare cu o singură linie:

UINavigationBar.appearance().barTntColor = UIColor.blue

Cu toate acestea, dacă aplicați aceeași abordare fontului astfel:

UILabel.appearance().font = UIFont(named: "Gills Sans", size: 14)

toate UILabel instanțele vor avea într-adevăr „Gills Sans”, dar și cu dimensiunea de 14pt. Nu cred că ar dori să aibă nicio aplicație numai Fonturi de 14pt în toată aplicația. De cand UIFont are nevoie întotdeauna de informații despre dimensiune pentru a fi inițializate, există nici o cale standard în UIKit pentru a schimba doar fontul fără a afecta dimensiunea.

Dar nu doriți să schimbați fontul fără a căuta toate fișierele Swift și Interface Builder? Imaginați-vă că aveți o aplicație cu zeci de ecrane și proprietarul produsului decide să schimbe fontul pentru întreaga aplicație. Sau aplicația dvs. dorește să acopere o altă limbă și doriți să utilizați un alt font pentru limba, deoarece ar arăta mai bine.

Acest scurt articol explică modul în care puteți face acest lucru cu doar câteva linii de cod.

UIView Extension

Când creați UIView extinderea și declararea unei proprietăți cu @objc modificator, puteți seta acea proprietate prin UIAppearance.

De exemplu, dacă declarați a UILabel proprietate de extensie substituteFontName asa:

Îl poți apela AppDelegate.application(:didFinishLaunching...)

UILabel.appearance().substituteFontName = "Gills Sans"

Și voilà, toate UILabel va fi în fontul „Gills Sans” cu dimensiunile adecvate. ?

Dar vrei să folosești și fonturi aldine, nu-i așa?

Viața este bună până acum, dar dacă doriți să specificați două variante diferite ale aceluiași font, cum ar fi fontul aldin? Ați crede că puteți adăuga o altă proprietate de extensie substituteBoldFontName și spune-i așa, nu?

UILabel.appearance().substituteFontName = fontNameUILabel.appearance().substituteBoldFontName = boldFontName

Nu atât de ușor. Dacă faci asta, atunci toate UILabel instanțele apar cu caractere aldine. Voi explica de ce.

Se pare ca UIAppearance apelează doar toate metodele de setare ale proprietăților înregistrate în ordinea în care au fost înregistrate.

Deci, dacă am implementat UILabel extensie ca aceasta:

apoi setarea celor două proprietăți prin UIAppearance rezultă în fiecare secvență de cod similară cu următoarea UILabel inițializare sub capotă.

font = UIFont(name: substituteFontName, size: font.pointSize)font = UIFont(name: substituteBoldFontName, size: font.pointSize)

Deci, prima linie este suprascrisă de a doua linie și veți avea fonturi îndrăznețe peste tot. ?

Ce poți face în legătură cu asta?

Pentru a rezolva această problemă, putem atribui noi înșine un stil de font adecvat pe baza stilului de font original.

Ne putem schimba UILabel extensie după cum urmează:

Acum, secvența de cod care se numește la UILabel inițializarea va fi după cum urmează și doar una dintre cele două font cesiunea va fi apelată într-o stare.

if font.fontName.range(of: "Medium") == nil {   font = UIFont(name: newValue, size: font.pointSize)}if font.fontName.range(of: "Medium") != nil {   font = UIFont(name: newValue, size: font.pointSize)}

Ca urmare, veți avea o aplicație cu un stil de text frumos unificat, în timp ce fonturile obișnuite și îndrăznețe coexistă, da! ?

Ar trebui să puteți utiliza aceeași logică pentru a adăuga și mai multe stiluri, cum ar fi fonturile cursive. De asemenea, ar trebui să puteți aplica aceeași abordare la un alt control cum ar fi UITextField.

Sper că acest lucru îi ajută pe colegii săi iOS, codificarea fericită !!