Sobes.tech
Middle

Какво се случва в системата, когато натискаме екрана?

sobes.tech AI

Отговор от AI

Когато потребителят натисне екрана на устройство с iOS, се случва следното:

  1. Получаване на събитие: Хардуерът (touch контролерът) регистрира докосването и генерира събитие.
  2. Обработка на събитието в IOKit: Драйверът на устройството в IOKit получава информация за докосването (координати, сила на натиск и др.).
  3. Изпращане на събитието към SpringBoard: IOKit предава събитието към системния процес SpringBoard.
  4. Маршрутизиране на събитието: SpringBoard определя активното приложение и изпраща събитието чрез IPC (Inter-Process Communication) на това приложение.
  5. Приемане на събитието в UIKit/SwiftUI: В приложението събитието се приема от рамката (UIKit или SwiftUI).
  6. Добавяне на събитието към опашката: Събитието се добавя към опашката за обработка на събития на приложението.
  7. Получаване на събитието от приложението: Основният цикъл (Run Loop) на приложението извлича събитието от опашката.
  8. Обработка на събитието чрез UIResponder: Събитието се предава на обекта UIEvent. UIKit започва процеса на доставка на събитието, обикновено започвайки от UIWindow.
  9. Проверка hitTest: Системата определя най-горния интерактивен UIView (или неговия еквивалент в SwiftUI), който се намира под точката на докосване, използвайки метода hitTest(_:with:) (в UIKit). Този метод рекурсивно преминава през йерархията на изгледите, проверявайки дали точката е вътре в bounds и дали изгледът е userInteractionEnabled.
  10. Доставка на събитието: Събитието се доставя на намерения изглед. Ако изгледът не обработва събитието (например, няма съответен жест или реализира touchesBegan:withEvent:, но не го обработва, или ако методът връща nil при hitTest), събитието се предава на следващия responder в веригата (responder chain), обикновено на superview или контролер на изгледа.
  11. Обработка на жестове или методи за докосване: Ако изгледът има прикачени разпознаватели на жестове (UIGestureRecognizer), те получават събитието първи. Ако жестът бъде разпознат, той се обработва с съответното действие в Objective-C или Swift. Ако жестовете не обработват събитието или липсват, събитието се предава към методите за докосване на изгледа (например, touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)).
  12. Изпълнение на логика: В обработчика на жеста или метода за докосване се изпълнява потребителската логика (например, промяна на състоянието на UI, навигация, изпълнение на действие).
  13. Обновяване на UI: Ако логиката води до промени в UI, рамката изпраща заявка за преизчертаване (ако е необходимо).

Ето пример за много опростена логика за обработка на докосване в обработчик на бутон:

// В рамките на класа ViewController или друг UIResponder
@IBAction func buttonTapped(_ sender: Any) {
    // Логика, изпълнявана при натискане на бутона
    print("Бутонът е натиснат!")
}

Пример за използване на touchesBegan (по-малко разпространен за прости натискания):

// В потребителски изглед, наследяващ от UIView
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first else { return }
    let location = touch.location(in: self)
    print("Екранът е докоснат CGPoint: \(location)")
    // Ако не се извика super, следващата обработка в веригата на responder-ите ще спре
    // super.touchesBegan(touches, with: event)
}