iOS touch
1. User touch
2. event is created
3. hit testing by coordinates - find first responder - UIView and successors (UIWindow)
3.1 hit testing - recursive find the most deep view
3.1.1 point inside - check coordinates
4. Send Touch Event to the First Responder
Diagramme de classes
Test des 3 coups
Trouver un First Responder
First Responder
dans ce cas est le plus profond UIView
point()
( hitTest()
utilise point()
en interne) dont la méthode renvoie un résultat positif. Il passe toujours par UIApplication -> UIWindow -> First Responder
func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?
func point(inside point: CGPoint, with event: UIEvent?) -> Bool
En interne hitTest()
ressemble à
func hitTest() -> View? {
if (isUserInteractionEnabled == false || isHidden == true || alpha == 0 || point() == false) { return nil }
for subview in subviews {
if subview.hitTest() != nil {
return subview
}
}
return nil
}
4 Envoyer l'événement tactile au First Responder
//UIApplication.shared.sendEvent()
//UIApplication, UIWindow
func sendEvent(_ event: UIEvent)
//UIResponder
func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?)
Prenons un exemple
Chaîne du répondant
Il s'agit d'une sorte de chain of responsibility
modèle. Il se compose de UIResponser
qui peut gérer UIEvent
. Dans ce cas, elle commence par le premier intervenant qui passe outre touch...
. super.touch...
appelle le maillon suivant de la chaîne de réponse
Responder chain
est également utilisé par addTarget
o sendAction
des approches comme le bus événementiel
//UIApplication.shared.sendAction()
func sendAction(_ action: Selector, to target: Any?, from sender: Any?, for event: UIEvent?) -> Bool
Voici un exemple
class AppDelegate: UIResponder, UIApplicationDelegate {
@objc
func foo() {
//this method is called using Responder Chain
print("foo") //foo
}
}
class ViewController: UIViewController {
func send() {
UIApplication.shared.sendAction(#selector(AppDelegate.foo), to: nil, from: view1, for: nil)
}
}
* isExclusiveTouch
est pris en compte lors de la manipulation de multitouch
[Android onTouch]
3 votes
Un très bon tutoriel qui m'a aidé lien
0 votes
Le document équivalent le plus récent pourrait être le suivant developer.apple.com/documentation/uikit/uiview/1622469-hittest