UIKit este un framework pentru construirea interfețelor grafice în aplicațiile iOS și macOS. Setul include UIView, UIViewController, elemente de control și sistemul Auto Layout, permițând crearea de ecrane adaptive și interactive. Conform Apple Developer Documentation (2025), UIKit conține peste 200 de clase pentru lucrul cu ferestre, vizualizări, animații, gesturi și text — este baza tuturor aplicațiilor pentru iPhone și iPad.
Principalele puncte
UIKit — este un framework de la Apple care oferă clase pentru crearea și gestionarea interfeței cu utilizatorul pe iOS, iPadOS și macOS (prin Mac Catalyst). Acesta funcționează pe baza Core Animation, Core Graphics și Quartz Core, abstractizând randarea de nivel scăzut în obiecte de nivel înalt — butoane, etichete, imagini și containere. UIKit a apărut odată cu iPhone OS 1 în 2007 și rămâne principalul framework pentru dezvoltarea iOS alături de SwiftUI.
Framework-ul urmează o abordare imperativă: dezvoltatorul creează instanțe ale claselor UIButton, UILabel, UIImageView, le setează proprietățile (culoare, font, poziție) și le adaugă în ierarhia vizualizărilor prin addSubview. Fiecare modificare a interfeței se face explicit — fără nicio magie de actualizare în culise. Acest lucru diferențiază UIKit de framework-urile declarative precum SwiftUI, unde descrierea stării redesenează automat interfața.
Framework-ul include mai multe categorii de clase. UIView — elementul de bază de care moștenesc toate componentele vizuale. UIWindow — containerul de nivel superior prin care vizualizările sunt afișate pe ecran. UIViewController — controlerul care gestionează un set de vizualizări și reacționează la rotirile ecranului, apariția tastaturii și notificările sistemului. UIApplication — punctul de intrare care procesează evenimentele de atingere și apăsare a butoanelor.
Pentru text se folosesc UILabel (text static), UITextField (introducere pe o singură linie), UITextView (introducere pe mai multe linii). Pentru butoane — UIButton, inclusiv sistem, personalizate și cu iconografia SF Symbols. Pentru navigare — UINavigationController, UITabBarController și UISplitViewController. În total, UIKit conține peste 200 de clase publice.
Arhitectura UIKit se bazează pe straturi: fiecare strat este responsabil pentru propriul aspect al afișării. La cel mai scăzut nivel se află Core Graphics — motorul de randare a căilor, textului și imaginilor. Mai sus — Core Animation, care gestionează compoziția straturilor (CALayer) și animațiile între stări. UIKit construiește deasupra lor un API orientat pe obiecte: UIView, UIViewController și UIResponder.
Fiecare aplicație are o ierarhie de vizualizări (view hierarchy) — un arbore a cărui rădăcină este UIWindow. Sub acesta — UIViewController-ul rădăcină, vizualizarea sa, iar în interior — subvizualizări imbricate. Evenimentele de atingere se propagă de-a lungul lanțului responder chain: de la cea mai imbricată vizualizare către părinți și mai departe către UIApplication. Dacă niciun obiect nu a procesat atingerea, aceasta este ignorată.
Fiecare UIView conține un strat CALayer responsabil pentru randarea pixelilor pe ecran. Vizualizarea gestionează atingerile și accesibilitatea, stratul — grafica: shadow, cornerRadius, border, transform. Separarea permite mutarea graficii grele pe un fir separat (render server), fără a bloca main thread. Apple recomandă lucrul direct cu CALayer dacă sunt necesare peste 200 de vizualizări pe ecran — aceasta reduce încărcarea CPU.
Lanțul responder începe cu obiectul care primește primul evenimentul de atingere. Dacă nu procesează evenimentul (metoda touchesBegan nu este suprascrisă), evenimentul este transmis următorului responder din lanț: next, superview, next responder, UIViewController, UIWindow, UIApplication, App Delegate. Acest lucru permite interceptarea gesturilor globale și a evenimentelor de tastatură la nivel de scenă, fără a adăuga un handler în fiecare vizualizare.
Fiecare UIViewController trece printr-o secvență strict definită de evenimente. Ciclul de viață include fazele: inițializare, încărcarea vizualizării, apariția pe ecran, actualizarea layout-ului la rotire, ascunderea, părăsirea ecranului și eliberarea memoriei. Dezvoltatorul suprascrie metodele corespunzătoare pentru a-și executa codul în fiecare etapă.
class ProfileViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
loadUserProfile()
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
clearCache()
}
}
În viewDidLoad se configurează interfața — se creează subvizualizări, se stabilesc constrângerile, se abonează delegații. În viewWillAppear se execută operațiile înainte de afișare: încărcarea datelor proaspete din rețea, actualizarea valorilor. viewDidDisappear — locul pentru dezabonarea de la notificări și curățarea datelor temporare. Apelul super este obligatoriu în toate suprascrierile, altfel lanțul de evenimente se întrerupe.
În versiunile vechi de iOS exista metoda viewDidUnload, apelată la insuficiența memoriei. Începând cu iOS 6 metoda a fost eliminată — acum UIKit descarcă automat vizualizările controlerului când nu sunt vizibile. Dezvoltatorul trebuie doar să declare toate referințele la vizualizări ca weak, pentru ca ARC să poată elibera corect memoria la primirea unei avertizări de la sistem.
UIKit acceptă două tipuri de tranziții: segue (prin Storyboard) și navigarea programatică prin UINavigationController. Tranziția programatică arată astfel: navigationController?.pushViewController(detailVC, animated: true). În acest caz, ciclul de viață al detailVC decurge normal — viewDidLoad este apelat o dată, viewWillAppear — de fiecare dată la afișare.
Auto Layout — este un sistem de poziționare a elementelor bazat pe relații matematice (constrângeri). În loc de coordonate X și Y fixe, dezvoltatorul descrie reguli: „butonul se află în dreapta etichetei cu un spațiu de 16pt” sau „vizualizarea se întinde pe lățimea ecranului cu margini de 20pt stânga și dreapta”. Sistemul rezolvă sistemul de ecuații rezultat în runtime, adaptând interfața la orice dimensiune a ecranului.
Constrângerile pot fi setate în Interface Builder (prin drag-and-drop) sau programatic în Swift. Fiecare constrângere este o instanță a clasei NSLayoutConstraint cu parametrii: firstItem, firstAttribute, relation, secondItem, secondAttribute, multiplier, constant. Constrângerile se activează prin isActive = true sau în masă prin NSLayoutConstraint.activate().
Odată cu iPhone X (2017), Apple a introdus Safe Area — zona ecranului liberă de notch, colțuri rotunjite și indicatorul home bar. Constrângerile trebuie legate de view.safeAreaLayoutGuide, nu de view. Layout Margins adaugă margini interne ale vizualizării, implicit 8pt sau 16pt în funcție de context. Utilizarea safeAreaLayoutGuide garantează afișarea corectă pe toate generațiile de iPhone și iPad.
Auto Layout suportă animația prin modificarea constantelor constrângerilor. Este suficient să actualizați constant constrângerii și să apelați UIView.animate cu layoutIfNeeded în interiorul blocului de animație. Sistemul recalculează lin poziția tuturor vizualizărilor din ierarhie. Această tehnică este folosită pentru blocuri extensibile, panoul adaptiv al tastaturii și schimbarea orientării ecranului.
UITableView și UICollectionView — două instrumente puternice ale UIKit pentru afișarea listelor și grilelor. UITableView este potrivit pentru liste verticale cu o singură coloană (chat, setări, flux de știri). UICollectionView — pentru grile, liste orizontale, carusele și layout-uri personalizate (galerie, produse, calendar). Ambele clase folosesc modelul de delegare pentru separarea datelor de aspect.
Sursa de date este protocolul UITableViewDataSource cu metodele obligatorii numberOfRowsInSection și cellForRowAt. Delegatul UITableViewDelegate gestionează apăsările pe celule, înălțimea rândurilor și evenimentele de derulare. Mecanismul reuse identifier reutilizează celulele care au ieșit din ecran, ceea ce este critic pentru performanță pe liste mari.
class ContactsViewController: UITableViewController {
private let contacts = ["Ana", "Boris", "Victor"]
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self,
forCellReuseIdentifier: "cell")
}
override func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
return contacts.count
}
override func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell",
for: indexPath)
var content = cell.defaultContentConfiguration()
content.text = contacts[indexPath.row]
cell.contentConfiguration = content
return cell
}
}
Exemplul arată un controler minimal pentru afișarea unui array de șiruri. Celula este configurată prin UIListContentConfiguration — API modern (iOS 14+) care a înlocuit textLabel și detailTextLabel învechite. Înregistrarea clasei de celulă în viewDidLoad este obligatorie, altfel aplicația va crash-ui cu o excepție în runtime.
Începând cu iOS 13, Apple recomandă UICollectionViewCompositionalLayout pentru construirea de layout-uri complexe. Dezvoltatorul descrie secțiunea, grupul, elementul și dimensiunile lor declarativ — rezultă o grilă cu geometrie arbitrară: bandă, grilă 2x2, carusel, ornament. Compositional Layout a înlocuit UICollectionViewFlowLayout învechit în toate proiectele noi. În combinație cu DiffableDataSource, actualizarea colecției se reduce la un singur apel apply(snapshot), iar animația modificărilor se execută automat.
Mai jos sunt două exemple practice de utilizare a UIKit în sarcini reale: crearea unei vizualizări personalizate cu umbră și rotunjire, precum și gestionarea gestului de glisare pentru ștergerea unui element dintr-o listă.
extension UIView {
func applyCardStyle() {
layer.cornerRadius = 12
layer.shadowOpacity = 0.15
layer.shadowRadius = 8
layer.shadowOffset = CGSize(width: 0, height: 2)
layer.masksToBounds = false
}
}
@objc private func handleSwipe(_ gesture: UISwipeGestureRecognizer) {
guard let swipedView = gesture.view else { return }
UIView.animate(withDuration: 0.3) {
swipedView.alpha = 0
swipedView.transform = CGAffineTransform(translationX: 300, y: 0)
} completion: { _ in
swipedView.removeFromSuperview()
}
}
Extensia applyCardStyle adaugă umbră și rotunjire oricărei vizualizări — utilă pentru carduri de produse, profiluri și notificări. Metoda handleSwipe cu animație șterge elementul dacă utilizatorul a glisat spre dreapta. Handler-ul este adăugat pe vizualizare prin addGestureRecognizer cu configurația UISwipeGestureRecognizer(direction: .right). Setarea masksToBounds = false este importantă pentru ca umbra să nu fie tăiată de marginile vizualizării.
Pentru interfețe mai complexe, utilizați UIStackView — un container care distribuie automat vizualizările imbricate pe orizontală sau verticală. Stack View simplifică layout-ul: nu este nevoie să setați constrângeri pentru fiecare element, este suficientă o constrângere pentru stack-ul însuși.
Întrebări frecvente
Frame — dreptunghiul în coordonatele superview (poziție + dimensiune). Bounds — dreptunghiul în coordonatele proprii ale vizualizării (începe întotdeauna de la 0,0). Frame se modifică la rotate și scale, bounds — nu.
UIKit descarcă automat vizualizările controlerelor ascunse. Dezvoltatorul trebuie doar să declare proprietățile vizualizărilor ca weak var, pentru ca ARC să poată elibera memoria la primirea unei avertizări de la sistem.
Pentru proiecte noi, Apple recomandă SwiftUI. Dacă proiectul este pe UIKit — utilizați XIB pentru ecrane individuale sau layout programatic prin SnapKit. Storyboard creează conflicte de merge și încetinește build-ul.
Utilizați UIColor cu suport pentru traitCollection: UIColor { $0.userInterfaceStyle == .dark ? ... : ... }. Activați Dark Mode în Info.plist cu cheia UIUserInterfaceStyle.
UIStackView calculează automat pozițiile și dimensiunile vizualizărilor imbricate pe baza alignment, distribution și spacing. Aceasta reduce codul constrângerilor cu 60–80% și simplifică adaptarea la diferite ecrane.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și