Sobes.tech
Middle

Šta se dešava u sistemu kada pritisnemo ekran?

sobes.tech АИ

Одговор од АИ

Када корисник додирне екран уређаја са iOS-ом, следи оно што се дешава:

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

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

// Унутар класе 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)
}