UIKit је фрејмворк за изградњу графичких интерфејса у iOS и macOS апликацијама. Скуп укључује UIView, UIViewController, елементе контроле и систем Auto Layout, омогућавајући стварање адаптивних и интерактивних екрана. Према Apple Developer Documentation (2025), UIKit садржи преко 200 класа за рад са прозорима, прегледима, анимацијама, гестовима и текстом — то је основа свих апликација за iPhone и iPad.
Главно
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-а, где опис стања аутоматски прецртава интерфејс.
Фрејмворк укључује неколико категорија класа. UIView — основни елемент од кога наслеђују све визуелне компоненте. UIWindow — контејнер највишег нивоа кроз који се прегледи приказују на екрану. UIViewController — контролер који управља скупом прегледа и реагује на ротације екрана, појаву тастатуре и системска обавештења. UIApplication — улазна тачка која обрађује догађаје додира и притиска дугмади.
За текст се користе UILabel (статични текст), UITextField(једноредни унос), UITextView (вишередни унос). За дугмад — UIButton, укључујући системска, прилагођена и са иконографијом SF Symbols. За навигацију — UINavigationController, UITabBarController и UISplitViewController. Укупно UIKit садржи преко 200 јавних класа.
Архитектура UIKit-а се заснива на слојевима: сваки слој је одговоран за свој аспект приказа. На најнижем нивоу се налази Core Graphics — погон за рендеровање путања, текста и слика. Више — Core Animation, која управља композицијом слојева (CALayer) и анимацијама између стања. UIKit надграђује на њима објектно-оријентисани API: UIView, UIViewController и UIResponder.
Свака апликација има хијерархију прегледа (view hierarchy) — стабло чији је корен UIWindow. Испод њега — корени UIViewController, његов преглед, а унутра — угнежђени subview-ови. Догађаји додира се шире дуж ланца responder chain: од најдубље угнежђеног прегледа ка родитељима и даље до UIApplication-а. Ако ниједан објекат није обрадио додир, игнорише се.
Сваки UIView садржи слој CALayer одговоран за рендеровање пиксела на екрану. Преглед управља додирима и приступачношћу, слој — графиком: shadow, cornerRadius, border, transform. Подела омогућава премештање тешке графике на засебну нит (render server), без блокирања main thread-а. Apple препоручује рад директно са CALayer-ом ако је потребно више од 200 прегледа на екрану — то смањује оптерећење CPU-а.
Ланац responder-а почиње од објекта који први прима догађај додира. Ако не обрађује догађај (метод touchesBegan није преоптерећен), догађај се преноси следећем responder-у у ланцу: next, superview, next responder, UIViewController, UIWindow, UIApplication, App Delegate. Ово омогућава пресретање глобалних гестова и догађаја тастатуре на нивоу сцене, без додавања руковаоца у сваки преглед.
Сваки UIViewController пролази кроз строго одређену секвенцу догађаја. Животни циклус укључује фазе: иницијализација, учитавање прегледа, појављивање на екрану, ажурирање распореда при ротацији, скривање, напуштање екрана и ослобађање меморије. Програмер преоптерећује одговарајуће методе да изврши свој код у свакој фази.
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 је обавезан у свим преоптерећењима, иначе се ланац догађаја прекида.
У старијим верзијама iOS-а постојао је метод viewDidUnload, позиван при недостатку меморије. Од iOS 6 метод је уклоњен — сада UIKit аутоматски истоварује прегледе контролера када нису видљиви. Програмер треба само да декларише све референце на прегледе као weak, како би ARC могао правилно да ослободи меморију при пријему упозорења од система.
UIKit подржава два типа прелаза: segue (путем Storyboard-а) и програмску навигацију кроз UINavigationController. Програмски прелаз изгледа овако: navigationController?.pushViewController(detailVC, animated: true). При томе животни циклус detailVC-а пролази нормално — viewDidLoad се позива једном, viewWillAppear — сваки пут при приказивању.
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().
Са 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 поново користи ћелије које су изашле из екрана, што је критично за перформансе на великим листама.
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-у.
Од iOS 13, Apple препоручује UICollectionViewCompositionalLayout за изградњу сложених распореда. Програмер описује секцију, групу, елемент и њихове величине декларативно — добија мрежу произвољне геометрије: трака, мрежа 2x2, карусел, орнамент. Compositional Layout је заменио застарели UICollectionViewFlowLayout у свим новим пројектима. У комбинацији са DiffableDataSource, ажурирање колекције се своди на један позив apply(snapshot), а анимација промена се извршава аутоматски.
Испод су два практична примера коришћења UIKit-а у стварним задацима: креирање прилагођеног прегледа са сенком и заобљењем, као и обрада геста превлачења за брисање елемента из листе.
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 — правоугаоник у координатама superview-а (позиција + величина). Bounds — правоугаоник у сопственим координатама прегледа (увек почиње од 0,0). Frame се мења при rotate и scale, bounds — не.
UIKit аутоматски истоварује прегледе скривених контролера. Програмер треба само да декларише својства прегледа као weak var како би ARC могао да ослободи меморију при упозорењу система.
За нове пројекте Apple препоручује SwiftUI. Ако је пројекат на UIKit-у — користите XIB за појединачне екране или програмски распоред кроз SnapKit. Storyboard ствара сукобе при спајању и успорава изградњу.
Користите UIColor са подршком за traitCollection: UIColor { $0.userInterfaceStyle == .dark ? ... : ... }. Активирајте Dark Mode у Info.plist кључем UIUserInterfaceStyle.
UIStackView аутоматски израчунава позиције и величине угнежђених прегледа на основу alignment, distribution и spacing-а. Скраћује код ограничења за 60–80% и поједностављује прилагођавање различитим екранима.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође