void CheckForBoundaryHop(UITouch touch) { long id = touch.Handle.ToInt64(); // TODO: Might require converting to a List for multiple hits TouchRecognizer recognizerHit = null; foreach (UIView view in viewDictionary.Keys) { CGPoint location = touch.LocationInView(view); if (new CGRect(new CGPoint(), view.Frame.Size).Contains(location)) { recognizerHit = viewDictionary[view]; } } if (recognizerHit != idToTouchDictionary[id]) { if (idToTouchDictionary[id] != null) { FireEvent(idToTouchDictionary[id], id, TouchActionType.Exited, touch, true); } if (recognizerHit != null) { FireEvent(recognizerHit, id, TouchActionType.Entered, touch, true); } idToTouchDictionary[id] = recognizerHit; } }
void FireEvent(TouchRecognizer recognizer, long id, TouchActionType actionType, UITouch touch, bool isInContact) { // Convert touch location to Xamarin.Forms Point value CGPoint cgPoint = touch.LocationInView(recognizer.View); Point xfPoint = new Point(cgPoint.X, cgPoint.Y); // Get the method to call for firing events Action <Element, TouchActionEventArgs> onTouchAction = recognizer.touchEffect.OnTouchAction; // Call that method onTouchAction(recognizer.element, new TouchActionEventArgs(id, actionType, xfPoint, isInContact)); }
protected override void OnAttached() { // Get the iOS UIView corresponding to the Element that the effect is attached to view = Control == null ? Container : Control; // Uncomment this line if the UIView does not have touch enabled by default //view.UserInteractionEnabled = true; // Get access to the TouchEffect class in the .NET Standard library TouchTracking.TouchEffect effect = (TouchTracking.TouchEffect)Element.Effects.FirstOrDefault(e => e is TouchTracking.TouchEffect); if (effect != null && view != null) { // Create a TouchRecognizer for this UIView touchRecognizer = new TouchRecognizer(Element, view, effect); view.AddGestureRecognizer(touchRecognizer); } }