Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.

Commit 27542f7

Browse files
AndreiMisiukevichrmarinho
authored andcommitted
Added TapGesture handling for Spans on Mac OS * fixes #4775
1 parent 156c7b6 commit 27542f7

File tree

1 file changed

+43
-13
lines changed

1 file changed

+43
-13
lines changed

Xamarin.Forms.Platform.iOS/EventTracker.cs

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,21 @@ Action<NSClickGestureRecognizer> CreateRecognizerHandler(WeakReference weakEvent
134134
});
135135
}
136136

137+
NSGestureProbe CreateTapRecognizerHandler(WeakReference weakEventTracker, WeakReference weakRecognizer)
138+
{
139+
return new NSGestureProbe((gesturerecognizer) =>
140+
{
141+
var tapGestureRecognizer = weakRecognizer.Target as TapGestureRecognizer;
142+
var eventTracker = weakEventTracker.Target as EventTracker;
143+
var view = eventTracker?._renderer?.Element as View;
144+
145+
if (tapGestureRecognizer != null && view != null)
146+
tapGestureRecognizer.SendTapped(view);
147+
148+
return false;
149+
});
150+
}
151+
137152
Action<NSClickGestureRecognizer> CreateChildRecognizerHandler(WeakReference weakEventTracker, WeakReference weakRecognizer)
138153
{
139154
return new Action<NSClickGestureRecognizer>((sender) =>
@@ -149,7 +164,26 @@ Action<NSClickGestureRecognizer> CreateChildRecognizerHandler(WeakReference weak
149164
if (item == clickGestureRecognizer && view != null)
150165
clickGestureRecognizer.SendClicked(view, clickGestureRecognizer.Buttons);
151166
});
167+
}
168+
169+
NSGestureProbe CreateChildTapRecognizerHandler(WeakReference weakEventTracker, WeakReference weakRecognizer)
170+
{
171+
return new NSGestureProbe((gesturerecognizer) =>
172+
{
173+
var eventTracker = weakEventTracker.Target as EventTracker;
174+
var view = eventTracker?._renderer?.Element as View;
175+
var childGestures = GetChildGestures(gesturerecognizer, weakEventTracker, weakRecognizer, eventTracker, view);
176+
177+
var tapGestureRecognizer = ((ChildGestureRecognizer)weakRecognizer.Target).GestureRecognizer as TapGestureRecognizer;
178+
var nativeRecognizer = gesturerecognizer as NSClickGestureRecognizer;
179+
var recognizers = childGestures?.GetChildGesturesFor<TapGestureRecognizer>(x => x.NumberOfTapsRequired == (int)nativeRecognizer.NumberOfClicksRequired);
152180

181+
foreach (var item in recognizers)
182+
if (item == tapGestureRecognizer && view != null)
183+
tapGestureRecognizer.SendTapped(view);
184+
185+
return false;
186+
});
153187
}
154188
#else
155189

@@ -206,25 +240,13 @@ protected virtual NativeGestureRecognizer GetNativeRecognizer(IGestureRecognizer
206240
if (recognizer is ClickGestureRecognizer clickRecognizer)
207241
{
208242
var returnAction = CreateRecognizerHandler(weakEventTracker, weakRecognizer, clickRecognizer);
209-
210243
var uiRecognizer = CreateClickRecognizer((int)clickRecognizer.Buttons, clickRecognizer.NumberOfClicksRequired, returnAction);
211244
return uiRecognizer;
212245
}
213246

214247
if (tapRecognizer != null)
215248
{
216-
var returnAction = new NSGestureProbe((gesturerecognizer) =>
217-
{
218-
var tapGestureRecognizer = weakRecognizer.Target as TapGestureRecognizer;
219-
var eventTracker = weakEventTracker.Target as EventTracker;
220-
var view = eventTracker?._renderer?.Element as View;
221-
222-
if (tapGestureRecognizer != null && view != null)
223-
tapGestureRecognizer.SendTapped(view);
224-
225-
return false;
226-
});
227-
249+
var returnAction = CreateTapRecognizerHandler(weakEventTracker, weakRecognizer);
228250
var uiRecognizer = CreateTapRecognizer(tapRecognizer.NumberOfTapsRequired, returnAction);
229251
return uiRecognizer;
230252
}
@@ -263,6 +285,13 @@ protected virtual NativeGestureRecognizer GetNativeRecognizer(IGestureRecognizer
263285
var uiRecognizer = CreateClickRecognizer((int)clickChildRecognizer.Buttons, clickChildRecognizer.NumberOfClicksRequired, returnAction);
264286
return uiRecognizer;
265287
}
288+
289+
if (childRecognizer.GestureRecognizer is TapGestureRecognizer tapChildRecognizer)
290+
{
291+
var returnAction = CreateChildTapRecognizerHandler(weakEventTracker, weakRecognizer);
292+
var uiRecognizer = CreateTapRecognizer(tapChildRecognizer.NumberOfTapsRequired, returnAction);
293+
return uiRecognizer;
294+
}
266295
#else
267296
if (childRecognizer.GestureRecognizer is TapGestureRecognizer tapChildRecognizer)
268297
{
@@ -470,6 +499,7 @@ NSClickGestureRecognizer CreateTapRecognizer(int numTaps, NSGestureProbe action)
470499

471500
return result;
472501
}
502+
473503
#endif
474504

475505
static bool ShouldRecognizeTapsTogether(NativeGestureRecognizer gesture, NativeGestureRecognizer other)

0 commit comments

Comments
 (0)