Sobes.tech
Middle

Cosa succede nel sistema quando premiamo lo schermo?

sobes.tech AI

Risposta dell'AI

Quando un utente tocca lo schermo di un dispositivo iOS, succede quanto segue:

  1. Registrazione dell'evento: L'hardware (touch controller) registra il tocco e genera un evento.
  2. Elaborazione dell'evento in IOKit: Il driver del dispositivo in IOKit riceve le informazioni sul tocco (coordinate, forza di pressione, ecc.).
  3. Invio dell'evento a SpringBoard: IOKit trasmette l'evento al processo di sistema SpringBoard.
  4. Routing dell'evento: SpringBoard determina l'applicazione attiva e invia l'evento tramite IPC (Inter-Process Communication) a questa applicazione.
  5. Ricezione dell'evento in UIKit/SwiftUI: L'app riceve l'evento tramite il framework (UIKit o SwiftUI).
  6. Aggiunta dell'evento alla coda: L'evento viene aggiunto alla coda di elaborazione degli eventi dell'app.
  7. Ricezione dell'evento dall'app: Il ciclo principale dell'app (Run Loop) estrae l'evento dalla coda.
  8. Elaborazione dell'evento tramite UIResponder: L'evento viene passato all'oggetto UIEvent. UIKit avvia il processo di consegna dell'evento, di solito partendo da UIWindow.
  9. Verifica hitTest: Il sistema determina la vista UIView (o il suo equivalente in SwiftUI) più in alto e interattiva sotto il punto di tocco, usando il metodo hitTest(_:with:). Questo metodo attraversa ricorsivamente la gerarchia delle viste, verificando se il punto è all'interno dei limiti e se la vista ha userInteractionEnabled attivo.
  10. Consegna dell'evento: L'evento viene consegnato alla vista trovata. Se la vista non gestisce l'evento (ad esempio, non ha un gesto corrispondente o implementa touchesBegan:withEvent: ma non lo gestisce, o se il metodo restituisce nil in hitTest), l'evento viene passato al prossimo responder nella catena (responder chain), di solito al superview o al view controller.
  11. Gestione di gesti o metodi di tocco: Se la vista ha riconoscitori di gesti (UIGestureRecognizer), questi ricevono l'evento per primi. Se un gesto viene riconosciuto, viene gestito tramite un'azione objc o funzione Swift. Se i gesti non gestiscono l'evento o sono assenti, l'evento viene passato ai metodi di tocco della vista (ad esempio, touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)).
  12. Esecuzione della logica: Nel gestore di gesto o metodo di tocco, viene eseguita la logica personalizzata (ad esempio, cambiare lo stato dell'UI, navigare, eseguire un'azione).
  13. Aggiornamento dell'UI: Se la logica provoca modifiche all'UI, il framework invia una richiesta di ridisegno (se necessario).

Ecco un esempio di logica molto semplificata per gestire un tocco su un pulsante:

// All'interno della classe ViewController o altro UIResponder
@IBAction func buttonTapped(_ sender: Any) {
    // Logica eseguita al clic del pulsante
    print("Pulsante premuto!")
}

Esempio di utilizzo di touchesBegan (meno comune per tocchi semplici):

// In una vista personalizzata che eredita da UIView
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    // Ottenere il primo tocco
    guard let touch = touches.first else { return }

    // Ottenere il punto del tocco nelle coordinate della vista
    let location = touch.location(in: self)

    print("Schermo toccato in CGPoint: \(location)")

    // Se non si chiama super, il processamento successivo nella catena dei responder si interrompe
    // super.touchesBegan(touches, with: event)
}