Middle
Какво се случва в системата, когато натискаме екрана?
sobes.tech AI
Отговор от AI
Когато потребителят натисне екрана на устройство с iOS, се случва следното:
- Получаване на събитие: Хардуерът (touch контролерът) регистрира докосването и генерира събитие.
- Обработка на събитието в IOKit: Драйверът на устройството в IOKit получава информация за докосването (координати, сила на натиск и др.).
- Изпращане на събитието към SpringBoard: IOKit предава събитието към системния процес SpringBoard.
- Маршрутизиране на събитието: SpringBoard определя активното приложение и изпраща събитието чрез IPC (Inter-Process Communication) на това приложение.
- Приемане на събитието в UIKit/SwiftUI: В приложението събитието се приема от рамката (UIKit или SwiftUI).
- Добавяне на събитието към опашката: Събитието се добавя към опашката за обработка на събития на приложението.
- Получаване на събитието от приложението: Основният цикъл (Run Loop) на приложението извлича събитието от опашката.
- Обработка на събитието чрез UIResponder: Събитието се предава на обекта
UIEvent. UIKit започва процеса на доставка на събитието, обикновено започвайки отUIWindow. - Проверка hitTest: Системата определя най-горния интерактивен
UIView(или неговия еквивалент в SwiftUI), който се намира под точката на докосване, използвайки методаhitTest(_:with:)(в UIKit). Този метод рекурсивно преминава през йерархията на изгледите, проверявайки дали точката е вътре в bounds и дали изгледът е userInteractionEnabled. - Доставка на събитието: Събитието се доставя на намерения изглед. Ако изгледът не обработва събитието (например, няма съответен жест или реализира
touchesBegan:withEvent:, но не го обработва, или ако методът връщаnilприhitTest), събитието се предава на следващия responder в веригата (responder chain), обикновено на superview или контролер на изгледа. - Обработка на жестове или методи за докосване: Ако изгледът има прикачени разпознаватели на жестове (
UIGestureRecognizer), те получават събитието първи. Ако жестът бъде разпознат, той се обработва с съответното действие в Objective-C или Swift. Ако жестовете не обработват събитието или липсват, събитието се предава към методите за докосване на изгледа (например,touchesBegan(_:with:),touchesMoved(_:with:),touchesEnded(_:with:),touchesCancelled(_:with:)). - Изпълнение на логика: В обработчика на жеста или метода за докосване се изпълнява потребителската логика (например, промяна на състоянието на UI, навигация, изпълнение на действие).
- Обновяване на 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)
}