UIKit
Interview Savollari
UIKit — Interview Savollari va Javoblari
Ushbu qo'llanmada UIKit framework'i bo'yicha eng ko'p so'raladigan 50 ta savol va javoblar jamlangan. UIKit hali ham ko'plab loyihalarda asosiy UI framework sifatida ishlatilmoqda va suhbatlarda chuqur savolar beriladi.
1. UIView va Layout Asoslari
1. UIView nima va uning vazifasi?
Javob: UIView — ekrandagi barcha vizual elementlarning asosiy klassi. U:
- Elementlarni chizish (rendering)
- Foydalanuvchi teginishlarini (touches) qabul qilish
- Bola elementlarni (subviews) boshqarish
- Animatsiyalarni bajarish
2. frame va bounds farqi?
Javob:
- frame — ota view (superview) koordinatalari tizimida joylashuv va o'lcham.
- bounds — o'z ichki koordinatalari tizimida joylashuv (odatda 0,0) va o'lcham.
let view = UIView(frame: CGRect(x: 50, y: 100, width: 200, height: 150))
print(view.frame) // (50, 100, 200, 150) — ota ichidagi joyi
print(view.bounds) // (0, 0, 200, 150) — o'z ichki o'lchami
💡 View aylantirilganda (rotation)
frameo'zgaradi,boundsesa o'zgarmaydi. 💡 Batafsil: UIKit 1 — View Ierarxiyasi va Koordinatalar Tizimi
3. Auto Layout nima va nega kerak?
Javob: Auto Layout — turli ekran o'lchamlarida (iPhone SE dan iPad Pro gacha) UI elementlarini to'g'ri joylashtirishni ta'minlovchi constraint-based layout tizimi. Frame asosida yozilgan UI faqat bitta ekran o'lchamida to'g'ri ko'rinadi.
4. Constraint'lar qanday yaratiladi?
Javob: 4 ta usul:
- Storyboard/XIB: Vizual chizish
- NSLayoutConstraint: Kodda aniq yaratish
- Visual Format Language (VFL): String asosida
- NSLayoutAnchor: Eng zamonaviy va qulay
// Eng tavsiya etiladigan usul — Anchors
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor),
label.widthAnchor.constraint(equalToConstant: 200),
label.heightAnchor.constraint(equalToConstant: 44)
])
⚠️
translatesAutoresizingMaskIntoConstraints = falseyozish esdan chiqsa — constraint'lar ishlamaydi!
5. intrinsicContentSize nima?
Javob: Ba'zi UI elementlari (UILabel, UIButton, UIImageView) o'z kontentiga qarab o'lchamini biladi. Bu ularga kenglik/balandlik constraint bermasdan ham ishlash imkonini beradi.
6. Content Hugging va Compression Resistance Priority?
Javob:
- Content Hugging: Element o'z kontentidan kattaroq bo'lmasligini ixtiyori. Priority yuqori → semirib ketmaydi.
- Compression Resistance: Element o'z kontentidan kichikroq bo'lmasligini ixtiyori. Priority yuqori → siqilib ketmaydi.
label.setContentHuggingPriority(.required, for: .horizontal)
label.setContentCompressionResistancePriority(.required, for: .horizontal)
7. Safe Area nima?
Javob: iPhone X dan boshlab paydo bo'lgan "xavfsiz maydon". Notch (tirnoq), Dynamic Island va Home Indicator ostida kontent qolmasligi uchun:
label.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
8. UIStackView afzalligi?
Javob: Elementlarni vertikal/gorizontal joylashtirishda faqat bitta constraint (position) bilan ishlaydi. Constraint'larni qo'lda yozish shart emas. Element yashirilganda (isHidden = true) bo'shliq avtomatik yopiladi.
let stack = UIStackView(arrangedSubviews: [label1, label2, label3])
stack.axis = .vertical
stack.spacing = 8
stack.distribution = .fillEqually
9. layoutSubviews() va setNeedsLayout() farqi?
Javob:
setNeedsLayout()— keyingi layout cycle'dalayoutSubviews()chaqirilishini belgilaydi.layoutIfNeeded()— darhol (sync) layout'ni yangilaydi.layoutSubviews()— o'zingiz chaqirmang, override qiling.
💡 Batafsil: UIKit 2 — Layout va Render Sikli
10. UIWindow nima?
Javob: Ilovadagi barcha UI elementlarining "ildizi" (root). Har bir ilova kamida bitta UIWindow'ga ega. U ekranga chizishning eng yuqori darajali konteyneridir.
2. View Controller va Navigation
11. UIViewController Life Cycle?
Javob:
loadView() → View'ni yaratish (odatda override qilmaymiz)
↓
viewDidLoad() → View xotiraga yuklandi (bir marta). Setup ishlari.
↓
viewWillAppear() → Ekranga chiqish arafasida. Har safar chaqiriladi.
↓
viewIsAppearing() → (iOS 13+) Ekranga chiqmoqda, aniq trait va frame o'lchamlari tayyor.
↓
viewDidAppear() → Ekranga to'liq chiqdi. Animatsiya boshlash.
↓
viewWillDisappear() → Ekrandan ketish arafasida.
↓
viewDidDisappear() → Ekrandan ketdi. Timer to'xtatish.
💡 Batafsil: UIKit 3 — View Controller Hayot Sikli
12. viewDidLoad vs viewWillAppear — qayerda nima yoziladi?
Javob:
viewDidLoad: Bir marta bajariladigan ishlar — UI yaratish, constraint'lar, initial data fetch.viewWillAppear: Har safar ekran ko'ringanda — data refresh, navigation bar sozlamasi.
13. UINavigationController qanday ishlaydi?
Javob: Stack (to'plam) asosida ishlaydi. Yangi ekranlar push qilinadi (stackka qo'shiladi), ortga qaytish pop (stackdan olinadi):
// Yangi ekranga o'tish
navigationController?.pushViewController(detailVC, animated: true)
// Ortga qaytish
navigationController?.popViewController(animated: true)
// Root'ga qaytish
navigationController?.popToRootViewController(animated: true)
14. UITabBarController nima?
Javob: Ekran ostidagi tab bar orqali bir nechta bo'lim o'rtasida o'tish. Har bir tab o'z UINavigationController'iga ega bo'lishi mumkin.
15. Modal Presentation turlari?
Javob:
.automatic(default, iOS 13+) — card style (pastga surib yopish)..fullScreen— butun ekranni qoplash..overFullScreen— orqa fon ko'rinadi (transparent)..pageSheet,.formSheet— iPad uchun.
let vc = DetailViewController()
vc.modalPresentationStyle = .fullScreen
present(vc, animated: true)
16. prepare(for segue:) nima?
Javob: Storyboard'da ekranlar o'rtasida ma'lumot uzatish uchun:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let detailVC = segue.destination as? DetailViewController {
detailVC.selectedItem = selectedItem
}
}
17. Container View Controller nima?
Javob: Boshqa VC'larni o'z ichiga oladigan VC. UINavigationController, UITabBarController — built-in misollar. Custom ham yasash mumkin: addChild(), willMove(toParent:), didMove(toParent:).
18. UIAlertController ishlatish?
Javob:
let alert = UIAlertController(title: "Diqqat", message: "O'chirilsinmi?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ha", style: .destructive) { _ in
self.deleteItem()
})
alert.addAction(UIAlertAction(title: "Yo'q", style: .cancel))
present(alert, animated: true)
3. UITableView va UICollectionView
19. UITableView asosiy tushunchalari?
Javob: UITableViewDataSource — nechta row/section va cell konfiguratsiyasi, UITableViewDelegate — row tanlash, balandlik, swipe actions.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = items[indexPath.row]
return cell
}
20. Cell Reuse mexanizmi?
Javob: 10 000 ta qator uchun 10 000 ta cell yaratilmaydi. Faqat ekranda ko'rinayotgan 10-12 tasi yaratiladi. Cell ekrandan chiqganda u qayta ishlatish uchun qo'yiladi (dequeue) va yangi ma'lumot bilan yangilanadi. Bu xotira va performansni oshiradi.
// Cell'ni ro'yxatdan o'tkazish
tableView.register(MyCell.self, forCellReuseIdentifier: "MyCell")
// Qayta ishlatish
let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MyCell
21. prepareForReuse() nega muhim?
Javob: Cell qayta ishlatilishidan oldin eski ma'lumotlarni tozalash uchun. Agar buni qilmasangiz — eski rasm yoki matn yangi cell'da ko'rinishi mumkin:
override func prepareForReuse() {
super.prepareForReuse()
imageView?.image = nil
textLabel?.text = nil
}
22. UICollectionView va UITableView farqi?
Javob:
- UITableView — faqat vertikal ro'yxat (bir ustun).
- UICollectionView — istalgan yo'nalishda, istalgan layout (grid, carousel, Pinterest style).
23. UICollectionViewFlowLayout vs CompositionalLayout?
Javob:
- FlowLayout — oddiy grid uchun (bir xil katakchalar).
- CompositionalLayout (iOS 13+) — murakkab, seksiya asosidagi layout. Har bir seksiya o'z layoutiga ega bo'lishi mumkin.
24. DiffableDataSource nima?
Javob: iOS 13+ da taqdim etilgan. reloadData() o'rniga "Snapshot" yaratib, faqat o'zgargan elementlarni animatsiya bilan yangilaydi:
var dataSource: UITableViewDiffableDataSource<Section, Item>!
func updateUI(with items: [Item]) {
var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
snapshot.appendSections([.main])
snapshot.appendItems(items)
dataSource.apply(snapshot, animatingDifferences: true)
}
25. Prefetching nima?
Javob: Foydalanuvchi scroll qilayotganda, ekranga yaqinlashayotgan cell'lar uchun ma'lumotlarni oldindan yuklash:
func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
for indexPath in indexPaths {
loadImage(for: items[indexPath.row])
}
}
4. Gesture va Event Handling
26. UIGestureRecognizer turlari?
Javob:
UITapGestureRecognizer— bosishUILongPressGestureRecognizer— uzoq bosishUISwipeGestureRecognizer— surishUIPanGestureRecognizer— harakatlanish (drag)UIPinchGestureRecognizer— kattalashtirish/kichiklashtirishUIRotationGestureRecognizer— aylantirish
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
view.addGestureRecognizer(tap)
@objc func handleTap(_ gesture: UITapGestureRecognizer) {
let point = gesture.location(in: view)
print("Bosildi: \(point)")
}
27. Responder Chain nima?
Javob: Touch event'i qabul qilinmasa, u zanjir bo'ylab yuqoriga uzatiladi:
UIButton → UIView → UIViewController → UIWindow → UIApplication → AppDelegate
hitTest(_:with:) — qaysi view tegilganini aniqlaydi. point(inside:with:) — nuqta view ichidami tekstiradi.
28. hitTest qanday ishlaydi?
Javob: Eng yuqoridagi view'dan boshlab, barcha subview'larni teskari tartibda tekshiradi (eng oxirgisi — eng ustidagi). Teginish qaysi view ichida ekanini aniqlash uchun point(inside:with:) chaqiradi.
5. Animatsiya va Drawing
29. UIView Animation turlari?
Javob:
// Oddiy animatsiya
UIView.animate(withDuration: 0.3) {
self.myView.alpha = 0
self.myView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
}
// Spring animatsiya
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.6,
initialSpringVelocity: 0.5) {
self.myView.center = newPosition
}
// Keyframe animatsiya
UIView.animateKeyframes(withDuration: 1.0, delay: 0) {
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5) {
self.myView.transform = CGAffineTransform(rotationAngle: .pi)
}
UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
self.myView.transform = .identity
}
}
30. CALayer va UIView aloqasi?
Javob: Har bir UIView'da layer (CALayer) bor. UIView — touch events + wrapper. CALayer — haqiqiy chizish (GPU). Layer orqali: cornerRadius, shadow, border, mask.
view.layer.cornerRadius = 12
view.layer.borderWidth = 1
view.layer.borderColor = UIColor.gray.cgColor
view.layer.shadowColor = UIColor.black.cgColor
view.layer.shadowOffset = CGSize(width: 0, height: 2)
view.layer.shadowOpacity = 0.3
view.clipsToBounds = true
31. CABasicAnimation nima?
Javob: Core Animation orqali layer property'larini animatsiya qilish:
let animation = CABasicAnimation(keyPath: "transform.rotation")
animation.fromValue = 0
animation.toValue = Double.pi * 2
animation.duration = 1.0
animation.repeatCount = .infinity
view.layer.add(animation, forKey: "rotate")
32. UIView.transition nima qiladi?
Javob: View ichidagi kontentni animatsiya bilan almashtirish:
UIView.transition(with: imageView, duration: 0.3, options: .transitionCrossDissolve) {
self.imageView.image = newImage
}
6. Storyboard, XIB va Programmatic UI
33. Storyboard, XIB va Programmatic UI farqlari?
Javob:
| Xususiyat | Storyboard | XIB | Programmatic |
|---|---|---|---|
| Vizual chizish | ✅ | ✅ | ❌ |
| Git Merge Conflict | ❌ Juda ko'p | ⚠️ O'rtacha | ✅ Deyarli yo'q |
| Reusability | ❌ Past | ✅ Yaxshi | ✅ Eng yaxshi |
| Build vaqti | ❌ Sekin | ⚠️ O'rtacha | ✅ Tez |
| Jamoaviy ish | ❌ Qiyin | ⚠️ O'rtacha | ✅ Oson |
34. IBOutlet va IBAction nima?
Javob:
IBOutlet— Storyboard/XIB'dagi UI elementni kodga bog'lash (property sifatida).IBAction— UI hodisasini (tugma bosish) kodga bog'lash (method sifatida).
35. Programmatic UI qanday yoziladi?
Javob:
class ProfileViewController: UIViewController {
private let nameLabel: UILabel = {
let label = UILabel()
label.text = "Azimjon"
label.font = .systemFont(ofSize: 24, weight: .bold)
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
view.addSubview(nameLabel)
NSLayoutConstraint.activate([
nameLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
nameLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20)
])
}
}
7. Networking va Data
36. URLSession data task (UIKit kontekstida)?
Javob:
func fetchUsers() {
let url = URL(string: "https://api.example.com/users")!
URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
guard let data = data, error == nil else { return }
let users = try? JSONDecoder().decode([User].self, from: data)
// ⚠️ MUHIM: UI faqat Main Thread'da yangilanadi!
DispatchQueue.main.async {
self?.users = users ?? []
self?.tableView.reloadData()
}
}.resume() // ← resume() esdan chiqsa so'rov ketmaydi!
37. Image Loading va Caching?
Javob: To'g'ridan-to'g'ri UIImage(data:) ishlatish — sekin va xotira isrofi. Professional yondashuv:
// NSCache asosida oddiy kesh
class ImageCache {
static let shared = ImageCache()
private let cache = NSCache<NSString, UIImage>()
func loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) {
let key = url.absoluteString as NSString
if let cached = cache.object(forKey: key) {
completion(cached)
return
}
URLSession.shared.dataTask(with: url) { [weak self] data, _, _ in
guard let data = data, let image = UIImage(data: data) else {
completion(nil)
return
}
self?.cache.setObject(image, forKey: key)
DispatchQueue.main.async { completion(image) }
}.resume()
}
}
8. Design Patterns (UIKit kontekstida)
38. Delegate Pattern?
Javob: UIKit'ning asosiy pattern'i. Bir obyekt boshqasiga mas'uliyatni topshiradi:
protocol ItemSelectionDelegate: AnyObject {
func didSelectItem(_ item: Item)
}
class ListViewController: UIViewController {
weak var delegate: ItemSelectionDelegate?
func userTappedItem(_ item: Item) {
delegate?.didSelectItem(item) // Tashqariga xabar berish
}
}
39. Target-Action Pattern?
Javob: UIButton, UISwitch kabi elementlarda amal biriktirish:
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
@objc func buttonTapped() {
print("Tugma bosildi")
}
40. NotificationCenter (Observer Pattern)?
Javob: Bir joydan xabar jo'natish, bir nechta joyda tinglash:
// Tinglash
NotificationCenter.default.addObserver(self, selector: #selector(handleLogin),
name: .userDidLogin, object: nil)
// Yuborish
NotificationCenter.default.post(name: .userDidLogin, object: nil, userInfo: ["userId": 123])
9. Advanced UIKit
41. Coordinator Pattern?
Javob: Navigation logic'ni VC'lardan ajratish:
protocol Coordinator {
var navigationController: UINavigationController { get }
func start()
}
class AppCoordinator: Coordinator {
let navigationController: UINavigationController
func start() {
let vc = HomeViewController()
vc.onItemSelected = { [weak self] item in
self?.showDetail(item)
}
navigationController.pushViewController(vc, animated: false)
}
func showDetail(_ item: Item) {
let vc = DetailViewController(item: item)
navigationController.pushViewController(vc, animated: true)
}
}
42. UIScrollView contentSize va contentOffset?
Javob:
contentSize— scroll qilinadigan kontent hajmi (ekrandan katta).contentOffset— hozir ekran qaysi nuqtada turibdi.contentInset— kontent atrofidagi bo'shliq.
43. UISearchController ishlatish?
Javob:
let searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
navigationItem.searchController = searchController
// UISearchResultsUpdating
func updateSearchResults(for searchController: UISearchController) {
let query = searchController.searchBar.text ?? ""
filteredItems = items.filter { $0.name.contains(query) }
tableView.reloadData()
}
44. UIPageViewController nima?
Javob: Sahifalar o'rtasida o'ngga-chapga surish (swipe) orqali o'tish uchun. Onboarding ekranlarida ko'p ishlatiladi.
45. UIContextMenuConfiguration (iOS 13+)?
Javob: Uzoq bosishda (long press) kontekst menyu ko'rsatish:
func tableView(_ tableView: UITableView,
contextMenuConfigurationForRowAt indexPath: IndexPath,
point: CGPoint) -> UIContextMenuConfiguration? {
return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ in
let delete = UIAction(title: "O'chirish", image: UIImage(systemName: "trash"),
attributes: .destructive) { _ in
self.deleteItem(at: indexPath)
}
return UIMenu(children: [delete])
}
}
46. UIAppearance nima?
Javob: Butun ilovadagi barcha bir turdagi UI elementlarni bir joydan sozlash:
// Barcha navigation bar'larni sozlash
UINavigationBar.appearance().tintColor = .systemBlue
UINavigationBar.appearance().prefersLargeTitles = true
// Barcha UISwitch'larni sozlash
UISwitch.appearance().onTintColor = .systemGreen
47. UIPasteboard va Clipboard?
Javob: Nusxa olish (copy) va joylash (paste):
// Nusxa olish
UIPasteboard.general.string = "Nusxalangan matn"
// Joylash
if let text = UIPasteboard.general.string {
textField.text = text
}
48. UIActivityViewController (Share sheet)?
Javob: Kontentni ulashish (share):
let items: [Any] = ["Salom!", URL(string: "https://apple.com")!]
let vc = UIActivityViewController(activityItems: items, applicationActivities: nil)
present(vc, animated: true)
49. Dark Mode qo'llab-quvvatlash (UIKit)?
Javob:
// Semantic ranglar ishlatish
view.backgroundColor = .systemBackground // light → oq, dark → qora
label.textColor = .label // light → qora, dark → oq
// Rejimni aniqlash (iOS 17+ da registerForTraitChanges tavsiya etiladi; eski usul: traitCollectionDidChange)
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.userInterfaceStyle == .dark {
print("Dark mode yondi")
}
}
💡 Batafsil: UIKit 3 — View Controller Hayot Sikli
50. UIViewController xotira boshqaruvi?
Javob:
class MyViewController: UIViewController {
var timer: Timer?
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in
self?.updateUI() // ← [weak self] — memory leak oldini olish
}
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
timer?.invalidate() // ← Timer'ni to'xtatish SHART
timer = nil
}
deinit {
print("VC xotiradan o'chirildi ✅")
}
}
💡 Batafsil: UIKit 4 — Xotira va ARC va UIKit 8 — Real Crash, Concurrency va Memory Buglar
Yakuniy Maslahat:
UIKit haqida savollar tushganda "Lifecycle" va "Memory Management" haqida albatta gapiring. VC'larning hayot sikli (viewDidLoad/viewWillAppear), Cell reuse, va [weak self] — bu UIKit'dagi eng ko'p so'raladigan mavzular. Amaliy loyihangizdan misollar ko'rsating! 📱