UIKit یک فریمورک برای ساخت رابطهای گرافیکی در برنامههای iOS و macOS است. این مجموعه شامل UIView، UIViewController، عناصر کنترلی و سیستم Auto Layout میباشد که امکان ایجاد صفحات تطبیقی و تعاملی را فراهم میکند. بر اساس Apple Developer Documentation (2025)، UIKit بیش از 200 کلاس برای کار با پنجرهها، نمایشها، انیمیشنها، ژستها و متن دارد — این اساس تمام برنامههای iPhone و iPad است.
نکات اصلی
UIKit — فریمورکی از اپل است که کلاسهایی برای ایجاد و مدیریت رابط کاربری در iOS، iPadOS و macOS (از طریق Mac Catalyst) فراهم میکند. این فریمورک بر روی Core Animation، Core Graphics و Quartz Core کار میکند و رندر سطح پایین را به اشیاء سطح بالا — دکمهها، برچسبها، تصاویر و کانتینرها — انتزاع میکند. UIKit همراه با iPhone OS 1 در سال 2007 ظهور کرد و همچنان به همراه SwiftUI فریمورک اصلی توسعه iOS باقی مانده است.
این فریمورک از رویکرد امری پیروی میکند: توسعهدهنده نمونههایی از کلاسهای 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 مسدود شود. اپل توصیه میکند اگر بیش از 200 نمایش روی صفحه نیاز دارید مستقیماً با CALayer کار کنید — این کار بار CPU را کاهش میدهد.
زنجیره responder از شیئی شروع میشود که اولین بار رویداد لمس را دریافت میکند. اگر رویداد را پردازش نکند (متود touchesBegan بازنویسی نشده باشد)، رویداد به responder بعدی در زنجیره منتقل میشود: next، superview، next responder، UIViewController، UIWindow، UIApplication، App Delegate. این امکان را میدهد ژستهای سراسری و رویدادهای صفحهکلید را در سطح صحنه بدون اضافه کردن handler به هر نمایش捕获 کرد.
هر 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 از چپ و راست کشیده میشود». سیستم معادلات حاصل را در زمان اجرا حل میکند و رابط را با هر اندازه صفحه تطبیق میدهد.
محدودیتها را میتوان در Interface Builder (از طریق drag-and-drop) یا برنامهریزی شده در Swift تنظیم کرد. هر محدودیت نمونهای از کلاس NSLayoutConstraint با پارامترهای: firstItem، firstAttribute، relation، secondItem، secondAttribute، multiplier، constant است. محدودیتها از طریق isActive = true یا به صورت انبوه از طریق NSLayoutConstraint.activate() فعال میشوند.
با iPhone X (2017) اپل Safe Area را معرفی کرد — ناحیهای از صفحه عاری از ناچ، گوشههای گرد و نشانگر 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 الزامی است، در غیر این صورت برنامه با خطای زمان اجرا crash میکند.
از iOS 13، اپل 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 با انیمیشن عنصر را حذف میکند اگر کاربر آن را به راست سوایپ کند. handler از طریق addGestureRecognizer با پیکربندی UISwipeGestureRecognizer(direction: .right) به نمایش اضافه میشود. تنظیم masksToBounds = false مهم است تا سایه توسط مرزهای نمایش بریده نشود.
برای رابطهای پیچیدهتر از UIStackView استفاده کنید — کانتینری که به طور خودکار نمایشهای تودرتو را به صورت افقی یا عمودی توزیع میکند. Stack View چیدمان را ساده میکند: نیازی به تنظیم محدودیت برای هر عنصر نیست، یک محدودیت برای خود استک کافی است.
سوالات متداول
Frame — مستطیل در مختصات superview (موقعیت + اندازه). Bounds — مستطیل در مختصات خود نمایش (همیشه از 0,0 شروع میشود). Frame در rotate و scale تغییر میکند، bounds — تغییر نمیکند.
UIKit به طور خودکار نمایشهای کنترلکنندههای مخفی را تخلیه میکند. توسعهدهنده فقط باید ویژگیهای نمایشها را به عنوان weak var اعلام کند تا ARC بتواند پس از هشدار سیستم حافظه را آزاد کند.
برای پروژههای جدید اپل SwiftUI را توصیه میکند. اگر پروژه روی UIKit است — از XIB برای صفحات جداگانه یا چیدمان برنامهریزی شده از طریق SnapKit استفاده کنید. Storyboard باعث merge conflicts میشود و build را کند میکند.
از UIColor با پشتیبانی traitCollection استفاده کنید: UIColor { $0.userInterfaceStyle == .dark ? ... : ... }. Dark Mode را در Info.plist با کلید UIUserInterfaceStyle فعال کنید.
UIStackView به طور خودکار موقعیتها و اندازههای نمایشهای تودرتو را بر اساس alignment، distribution و spacing محاسبه میکند. این کار کد محدودیتها را 60–80% کاهش میدهد و تطبیق با صفحات مختلف را ساده میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید