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:
- Captura do evento: O hardware (controlador de toque) regista o toque e gera um evento.
- Processamento do evento no IOKit: O controlador do dispositivo no IOKit recebe as informações do toque (coordenadas, força de pressão, etc.).
- Envio do evento para o SpringBoard: O IOKit transmite o evento para o processo do sistema SpringBoard.
- 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.
- Receção do evento no UIKit/SwiftUI: A aplicação recebe o evento através do framework (UIKit ou SwiftUI).
- Adição do evento à fila: O evento é adicionado à fila de processamento de eventos da aplicação.
- Receção do evento pela aplicação: O ciclo principal da aplicação (Run Loop) extrai o evento da fila.
- 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 objetoUIWindow. - 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étodohitTest(_:with:)(no UIKit). Este método percorre recursivamente a hierarquia de vistas, verificando se o ponto está dentro dos limites e se a vista temuserInteractionEnabledativado. - 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 emhitTest), o evento é passado ao próximo responder na cadeia (responder chain), geralmente ao superview ou ao controlador de vista. - 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:)). - 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).
- 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)
}