UIKit — шта је то, кључни појмови и архитектура

Аутор: IT Sectr Објављено: 2026-04-30 Време читања: 10 мин

UIKit је фрејмворк за изградњу графичких интерфејса у iOS и macOS апликацијама. Скуп укључује UIView, UIViewController, елементе контроле и систем Auto Layout, омогућавајући стварање адаптивних и интерактивних екрана. Према Apple Developer Documentation (2025), UIKit садржи преко 200 класа за рад са прозорима, прегледима, анимацијама, гестовима и текстом — то је основа свих апликација за iPhone и iPad.

Главно

  • UIKit — је Apple-ов фрејмворк за изградњу интерфејса на iOS, iPadOS и macOS са императивним приступом управљању прегледима.
  • UIView — основна класа за све визуелне елементе: дугмад, текстуална поља, слике и контејнере.
  • UIViewController управља животним циклусом екрана: од учитавања прегледа до ослобађања меморије.
  • Auto Layout описује положај елемената кроз систем ограничења, прилагођавајући интерфејс различитим величинама екрана.
  • Делегати и dataSource — кључни образац за табеле и колекције, раздвајајући податке и њихов приказ.

Шта је UIKit?

UIKit — је Apple-ов фрејмворк који пружа класе за креирање и управљање корисничким интерфејсом на iOS, iPadOS и macOS (путем Mac Catalyst-а). Ради на бази Core Animation, Core Graphics и Quartz Core, апстрахујући нискоризинско рендеровање у високоризинске објекте — дугмад, ознаке, слике и контејнере. UIKit се појавио заједно са iPhone OS 1 2007. године и остаје главни фрејмворк за iOS развој уз SwiftUI.

Фрејмворк следи императивни приступ: програмер креира инстанце класа UIButton, UILabel, UIImageView, подешава њихова својства (боју, фонт, положај) и додаје их у хијерархију прегледа путем addSubview. Свака промена интерфејса се изричито извршава — без икакве магије ажурирања у позадини. Ово разликује UIKit од декларативних фрејмворка попут SwiftUI-а, где опис стања аутоматски прецртава интерфејс.

Основне класе UIKit-а

Фрејмворк укључује неколико категорија класа. UIView — основни елемент од кога наслеђују све визуелне компоненте. UIWindow — контејнер највишег нивоа кроз који се прегледи приказују на екрану. UIViewController — контролер који управља скупом прегледа и реагује на ротације екрана, појаву тастатуре и системска обавештења. UIApplication — улазна тачка која обрађује догађаје додира и притиска дугмади.

За текст се користе UILabel (статични текст), UITextField(једноредни унос), UITextView (вишередни унос). За дугмад — UIButton, укључујући системска, прилагођена и са иконографијом SF Symbols. За навигацију — UINavigationController, UITabBarController и UISplitViewController. Укупно UIKit садржи преко 200 јавних класа.

Архитектура UIKit-а: слојеви и хијерархија прегледа

Архитектура UIKit-а се заснива на слојевима: сваки слој је одговоран за свој аспект приказа. На најнижем нивоу се налази Core Graphics — погон за рендеровање путања, текста и слика. Више — Core Animation, која управља композицијом слојева (CALayer) и анимацијама између стања. UIKit надграђује на њима објектно-оријентисани API: UIView, UIViewController и UIResponder.

Свака апликација има хијерархију прегледа (view hierarchy) — стабло чији је корен UIWindow. Испод њега — корени UIViewController, његов преглед, а унутра — угнежђени subview-ови. Догађаји додира се шире дуж ланца responder chain: од најдубље угнежђеног прегледа ка родитељима и даље до UIApplication-а. Ако ниједан објекат није обрадио додир, игнорише се.

UIView и CALayer

Сваки UIView садржи слој CALayer одговоран за рендеровање пиксела на екрану. Преглед управља додирима и приступачношћу, слој — графиком: shadow, cornerRadius, border, transform. Подела омогућава премештање тешке графике на засебну нит (render server), без блокирања main thread-а. Apple препоручује рад директно са CALayer-ом ако је потребно више од 200 прегледа на екрану — то смањује оптерећење CPU-а.

Responder Chain у детаљима

Ланац responder-а почиње од објекта који први прима догађај додира. Ако не обрађује догађај (метод touchesBegan није преоптерећен), догађај се преноси следећем responder-у у ланцу: next, superview, next responder, UIViewController, UIWindow, UIApplication, App Delegate. Ово омогућава пресретање глобалних гестова и догађаја тастатуре на нивоу сцене, без додавања руковаоца у сваки преглед.

Животни циклус UIViewController-а

Сваки UIViewController пролази кроз строго одређену секвенцу догађаја. Животни циклус укључује фазе: иницијализација, учитавање прегледа, појављивање на екрану, ажурирање распореда при ротацији, скривање, напуштање екрана и ослобађање меморије. Програмер преоптерећује одговарајуће методе да изврши свој код у свакој фази.

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

У viewDidLoad се конфигурише интерфејс — креирају се subview-ови, постављају ограничења, пријављују делегати. У viewWillAppear се извршавају операције пре приказа: учитавање свежих података из мреже, ажурирање вредности. viewDidDisappear — место за одјаву са обавештења и чишћење привремених података. Позив super је обавезан у свим преоптерећењима, иначе се ланац догађаја прекида.

Управљање меморијом и viewDidUnload

У старијим верзијама iOS-а постојао је метод viewDidUnload, позиван при недостатку меморије. Од iOS 6 метод је уклоњен — сада UIKit аутоматски истоварује прегледе контролера када нису видљиви. Програмер треба само да декларише све референце на прегледе као weak, како би ARC могао правилно да ослободи меморију при пријему упозорења од система.

Прелази између контролера

UIKit подржава два типа прелаза: segue (путем Storyboard-а) и програмску навигацију кроз UINavigationController. Програмски прелаз изгледа овако: navigationController?.pushViewController(detailVC, animated: true). При томе животни циклус detailVC-а пролази нормално — viewDidLoad се позива једном, viewWillAppear — сваки пут при приказивању.

Auto Layout и адаптивни распоред

Auto Layout — је систем позиционирања елемената заснован на математичким релацијама (ограничењима). Уместо чврсто одређених координата X и Y, програмер описује правила: „дугме се налази десно од ознаке са размаком од 16pt” или „преглед се протеже ширином екрана са размацима од 20pt лево и десно”. Систем решава добијени систем једначина у runtime-у, прилагођавајући интерфејс било којој величини екрана.

Ограничења се могу поставити у Interface Builder-у (путем drag-and-drop) или програмски у Swift-у. Свако ограничење је инстанца класе NSLayoutConstraint са параметрима: firstItem, firstAttribute, relation, secondItem, secondAttribute, multiplier, constant. Ограничења се активирају путем isActive = true или масовно путем NSLayoutConstraint.activate().

Safe Area и Layout Margins

Са iPhone X (2017) Apple је увео Safe Area — област екрана слободну од notch-а, заобљених углова и индикатора home bar-а. Ограничења треба везивати за view.safeAreaLayoutGuide, а не за view. Layout Margins додају унутрашње размаке прегледа, подразумевано 8pt или 16pt у зависности од контекста. Коришћење safeAreaLayoutGuide гарантује исправан приказ на свим генерацијама iPhone-а и iPad-а.

Анимација ограничења

Auto Layout подржава анимацију кроз промену константи ограничења. Довољно је ажурирати constant ограничења и позвати UIView.animate са layoutIfNeeded унутар блока анимације. Систем глатко прерачунава положај свих прегледа у хијерархији. Ова техника се користи за расклапајуће блокове, адаптивни панел тастатуре и промену оријентације екрана.

Рад са табелама и колекцијама

UITableView и UICollectionView — два моћна алата UIKit-а за приказ листи и мрежа. UITableView је погодан за вертикалне листе са једном колоном (ћаскање, подешавања, ток вести). UICollectionView — за мреже, хоризонталне листе, каруселе и прилагођене распореде (галерија, производи, календар). Обе класе користе образац делегирања за раздвајање података и изгледа.

Извор података је протокол UITableViewDataSource са обавезним методама numberOfRowsInSection и cellForRowAt. Делегат UITableViewDelegate обрађује притиске на ћелије, висину редова и догађаје скроловања. Механизам reuse identifier поново користи ћелије које су изашле из екрана, што је критично за перформансе на великим листама.

swift
class ContactsViewController: UITableViewController {

    private let contacts = ["Ана", "Борис", "Виктор"]

    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
    }
}

Пример приказује минимални контролер за приказ низа стрингова. Ћелија се конфигурише путем UIListContentConfiguration — модерног API-ја (iOS 14+) који је заменио застареле textLabel и detailTextLabel. Регистрација класе ћелије у viewDidLoad је обавезна, иначе ће апликација пасти са изузетком у runtime-у.

UICollectionView и Compositional Layout

Од iOS 13, Apple препоручује UICollectionViewCompositionalLayout за изградњу сложених распореда. Програмер описује секцију, групу, елемент и њихове величине декларативно — добија мрежу произвољне геометрије: трака, мрежа 2x2, карусел, орнамент. Compositional Layout је заменио застарели UICollectionViewFlowLayout у свим новим пројектима. У комбинацији са DiffableDataSource, ажурирање колекције се своди на један позив apply(snapshot), а анимација промена се извршава аутоматски.

Примери кода у Swift-у

Испод су два практична примера коришћења UIKit-а у стварним задацима: креирање прилагођеног прегледа са сенком и заобљењем, као и обрада геста превлачења за брисање елемента из листе.

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

Проширење applyCardStyle додаје сенку и заобљење било ком прегледу — корисно за картице производа, профиле и обавештења. Метод handleSwipe са анимацијом брише елемент ако је корисник превукао удесно. Руковалац се додаје на преглед путем addGestureRecognizer са конфигурацијом UISwipeGestureRecognizer(direction: .right). Подешавање masksToBounds = false је важно да сенка не буде одсечена границама прегледа.

За сложеније интерфејсе користите UIStackView — контејнер који аутоматски распоређује угнежђене прегледе хоризонтално или вертикално. Stack View поједностављује распоред: не треба постављати ограничења за сваки елемент, довољно је једно ограничење за сам стек.

Често постављана питања

Која је разлика између frame и bounds код UIView-а?

Frame — правоугаоник у координатама superview-а (позиција + величина). Bounds — правоугаоник у сопственим координатама прегледа (увек почиње од 0,0). Frame се мења при rotate и scale, bounds — не.

Како ослободити меморију од неискоришћених прегледа?

UIKit аутоматски истоварује прегледе скривених контролера. Програмер треба само да декларише својства прегледа као weak var како би ARC могао да ослободи меморију при упозорењу система.

Да ли вреди користити Storyboard 2026. године?

За нове пројекте Apple препоручује SwiftUI. Ако је пројекат на UIKit-у — користите XIB за појединачне екране или програмски распоред кроз SnapKit. Storyboard ствара сукобе при спајању и успорава изградњу.

Како имплементирати тамну тему у UIKit-у?

Користите UIColor са подршком за traitCollection: UIColor { $0.userInterfaceStyle == .dark ? ... : ... }. Активирајте Dark Mode у Info.plist кључем UIUserInterfaceStyle.

По чему је UIStackView бољи од ручних ограничења?

UIStackView аутоматски израчунава позиције и величине угнежђених прегледа на основу alignment, distribution и spacing-а. Скраћује код ограничења за 60–80% и поједностављује прилагођавање различитим екранима.

Резиме

  • UIKit — главни Apple-ов фрејмворк за изградњу интерфејса iOS, iPadOS и macOS са императивним приступом.
  • UIView управља рендеровањем и додирима; његову графичку компоненту обрађује слој CALayer који ради на засебној нити.
  • UIViewController пролази строги животни циклус: од viewDidLoad до ослобађања меморије са могућношћу преоптерећења сваке фазе.
  • Auto Layout замењује чврсте координате системом ограничења, прилагођавајући интерфејс било којим екранима и оријентацијама.
  • UITableView и UICollectionView са reuse identifier обезбеђују перформансе на великим листама и подржавају модеран Compositional Layout.
  • UIStackView поједностављује распоред секвенци прегледа, скраћујући код ограничења за 60–80%.
  • За нове пројекте Apple препоручује SwiftUI, али UIKit остаје актуелан за подршку старим iOS верзијама и сложене прилагођене интерфејсе.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође