UIKit — ce este, concepte cheie și arhitectură

Autor: IT Sectr Publicat: 2026-04-30 Timp de citire: 10 min

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 framework-ul Apple pentru construirea interfețelor pe iOS, iPadOS și macOS cu o abordare imperativă a gestionării vizualizărilor.
  • UIView — clasa de bază pentru toate elementele vizuale: butoane, câmpuri text, imagini și containere.
  • UIViewController gestionează ciclul de viață al ecranului: de la încărcarea vizualizării până la eliberarea memoriei.
  • Auto Layout descrie poziția elementelor printr-un sistem de constrângeri, adaptând interfața la diferite dimensiuni de ecran.
  • Delegații și dataSource — modelul cheie pentru tabele și colecții, separând datele de afișarea lor.

Ce este UIKit?

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.

Clasele principale ale UIKit

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: straturi și ierarhia vizualizărilor

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ă.

UIView și CALayer

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 în detaliu

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.

Ciclul de viață al UIViewController

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ă.

swift
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.

Gestionarea memoriei și viewDidUnload

Î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.

Tranziții între controlere

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 și layout adaptiv

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().

Safe Area și Layout Margins

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.

Animația constrângerilor

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.

Lucrul cu tabele și colecții

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.

swift
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.

UICollectionView și Compositional Layout

Î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.

Exemple de cod în Swift

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ă.

swift
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

Care este diferența dintre frame și bounds la UIView?

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.

Cum se eliberează memoria vizualizărilor neutilizate?

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.

Merită să folosești Storyboard în 2026?

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.

Cum se implementează tema întunecată în UIKit?

Utilizați UIColor cu suport pentru traitCollection: UIColor { $0.userInterfaceStyle == .dark ? ... : ... }. Activați Dark Mode în Info.plist cu cheia UIUserInterfaceStyle.

Cu ce este UIStackView mai bun decât constrângerile manuale?

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

  • UIKit — framework-ul principal Apple pentru construirea interfețelor iOS, iPadOS și macOS cu abordare imperativă.
  • UIView gestionează randarea și atingerile; partea sa grafică este procesată de stratul CALayer, care rulează pe un fir separat.
  • UIViewController parcurge un ciclu de viață strict: de la viewDidLoad până la eliberarea memoriei, cu posibilitatea de a suprascrie fiecare etapă.
  • Auto Layout înlocuiește coordonatele fixe cu un sistem de constrângeri, adaptând interfața la orice ecrane și orientări.
  • UITableView și UICollectionView cu reuse identifier asigură performanța pe liste mari și suportă Compositional Layout modern.
  • UIStackView simplifică layout-ul secvențelor de vizualizări, reducând codul constrângerilor cu 60–80%.
  • Pentru proiecte noi, Apple recomandă SwiftUI, dar UIKit rămâne relevant pentru suportul iOS vechi și interfețe personalizate complexe.

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.

Discutați proiectul

Citiți și