Sobes.tech
Middle

O que acontece no sistema quando pressionamos na tela?

sobes.tech IA

Resposta da IA

Quando um utilizador toca na tela de um dispositivo iOS, o seguinte acontece:

  1. Captura do evento: O hardware (controlador de toque) regista o toque e gera um evento.
  2. Processamento do evento no IOKit: O controlador do dispositivo no IOKit recebe as informações do toque (coordenadas, força de pressão, etc.).
  3. Envio do evento para o SpringBoard: O IOKit transmite o evento para o processo do sistema SpringBoard.
  4. Roteamento do evento: O SpringBoard determina a aplicação ativa e envia o evento através de IPC (Comunicação entre Processos) para essa aplicação.
  5. Receção do evento no UIKit/SwiftUI: A aplicação recebe o evento através do framework (UIKit ou SwiftUI).
  6. Adição do evento à fila: O evento é adicionado à fila de processamento de eventos da aplicação.
  7. Receção do evento pela aplicação: O ciclo principal da aplicação (Run Loop) extrai o evento da fila.
  8. Processamento do evento através do UIResponder: O evento é passado ao objeto UIEvent. O UIKit inicia o processo de entrega do evento, geralmente começando pelo objeto UIWindow.
  9. Verificação hitTest: O sistema determina a vista UIView (ou seu equivalente em SwiftUI) mais superior e interativa que está abaixo do ponto de toque, usando o método hitTest(_:with:) (no UIKit). Este método percorre recursivamente a hierarquia de vistas, verificando se o ponto está dentro dos limites e se a vista tem userInteractionEnabled ativado.
  10. Entrega do evento: O evento é entregue à vista encontrada. Se a vista não processar o evento (por exemplo, não tiver um gesto correspondente ou implementar touchesBegan:withEvent: mas não o processar, ou se o método retornar nil em hitTest), o evento é passado ao próximo responder na cadeia (responder chain), geralmente ao superview ou ao controlador de vista.
  11. Processamento de gestos ou métodos de toque: Se a vista tiver reconhecedores de gestos (UIGestureRecognizer), estes recebem o evento primeiro. Se um gesto for reconhecido, é tratado por uma ação objc ou função Swift. Se os gestos não processarem o evento ou estiverem ausentes, o evento é passado para os métodos de toque da vista (por exemplo, touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)).
  12. Execução da lógica: No gestor de gesto ou método de toque, a lógica personalizada é executada (por exemplo, alteração do estado da UI, navegação, execução de ação).
  13. Atualização da UI: Se a lógica provocar alterações na UI, o framework envia uma solicitação de redesenho (se necessário).

Aqui um exemplo de lógica muito simplificada para lidar com um toque num botão:

// Dentro da classe ViewController ou outro UIResponder
@IBAction func buttonTapped(_ sender: Any) {
    // Lógica executada ao pressionar o botão
    print("Botão pressionado!")
}

Exemplo de uso de touchesBegan (menos comum para toques simples):

// Em uma vista personalizada que herda de UIView
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    // Obter o primeiro toque
    guard let touch = touches.first else { return }

    // Obter a localização do toque nas coordenadas da vista
    let location = touch.location(in: self)

    print("Tela tocada em CGPoint: \(location)")

    // Se não chamar super, o processamento subsequente na cadeia responder será interrompido
    // super.touchesBegan(touches, with: event)
}