Azimjon Abdurasulov

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) frame o'zgaradi, bounds esa 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:

  1. Storyboard/XIB: Vizual chizish
  2. NSLayoutConstraint: Kodda aniq yaratish
  3. Visual Format Language (VFL): String asosida
  4. 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 = false yozish 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'da layoutSubviews() 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 — bosish
  • UILongPressGestureRecognizer — uzoq bosish
  • UISwipeGestureRecognizer — surish
  • UIPanGestureRecognizer — harakatlanish (drag)
  • UIPinchGestureRecognizer — kattalashtirish/kichiklashtirish
  • UIRotationGestureRecognizer — 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:

XususiyatStoryboardXIBProgrammatic
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! 📱

Markdown manba

iOS Lessons