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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също