diff options
author | adrianknight89 <adrianknight89@outlook.com> | 2017-01-03 05:30:35 -0600 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2017-01-03 11:30:35 +0000 |
commit | cc0eb5ba4326de96a52c0318a61b89c3bcb098e5 (patch) | |
tree | 71fcbef6e68b39289d362c84d735df1381054c3f /Xamarin.Forms.Platform.iOS | |
parent | 8c5fd096945301a2db0d85baf77ce46812a8d89f (diff) | |
download | xamarin-forms-cc0eb5ba4326de96a52c0318a61b89c3bcb098e5.tar.gz xamarin-forms-cc0eb5ba4326de96a52c0318a61b89c3bcb098e5.tar.bz2 xamarin-forms-cc0eb5ba4326de96a52c0318a61b89c3bcb098e5.zip |
[iOS] Prevent multiple ListView cells from being swiped simultaneously (#578)
* disable multiple cell swipe
* add sample code
* refactored
* convert to weakreference
* remove null setting
* change weakreference setting place
* remove if
* revert isopen changes
* add instructions
Diffstat (limited to 'Xamarin.Forms.Platform.iOS')
-rw-r--r-- | Xamarin.Forms.Platform.iOS/ContextScrollViewDelegate.cs | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/Xamarin.Forms.Platform.iOS/ContextScrollViewDelegate.cs b/Xamarin.Forms.Platform.iOS/ContextScrollViewDelegate.cs index 14f95a73..9d5debf1 100644 --- a/Xamarin.Forms.Platform.iOS/ContextScrollViewDelegate.cs +++ b/Xamarin.Forms.Platform.iOS/ContextScrollViewDelegate.cs @@ -45,7 +45,7 @@ namespace Xamarin.Forms.Platform.iOS GlobalCloseContextGestureRecognizer _globalCloser; bool _isDisposed; - + static WeakReference<UIScrollView> s_scrollViewBeingScrolled; UITableView _table; public ContextScrollViewDelegate(UIView container, List<UIButton> buttons, bool isOpen) @@ -72,6 +72,11 @@ namespace Xamarin.Forms.Platform.iOS public override void DraggingStarted(UIScrollView scrollView) { + if (ShouldIgnoreScrolling(scrollView)) + return; + + s_scrollViewBeingScrolled = new WeakReference<UIScrollView>(scrollView); + if (!IsOpen) SetButtonsShowing(true); @@ -90,6 +95,9 @@ namespace Xamarin.Forms.Platform.iOS public override void Scrolled(UIScrollView scrollView) { + if (ShouldIgnoreScrolling(scrollView)) + return; + var width = _finalButtonSize; var count = _buttons.Count; @@ -116,10 +124,9 @@ namespace Xamarin.Forms.Platform.iOS SetButtonsShowing(false); RestoreHighlight(scrollView); + s_scrollViewBeingScrolled = null; ClearCloserRecognizer(scrollView); - - if (ClosedCallback != null) - ClosedCallback(); + ClosedCallback?.Invoke(); } } @@ -131,6 +138,9 @@ namespace Xamarin.Forms.Platform.iOS public override void WillEndDragging(UIScrollView scrollView, PointF velocity, ref PointF targetContentOffset) { + if (ShouldIgnoreScrolling(scrollView)) + return; + var width = ButtonsWidth; var x = targetContentOffset.X; var parentThreshold = scrollView.Frame.Width * .4f; @@ -187,6 +197,19 @@ namespace Xamarin.Forms.Platform.iOS } } + static bool ShouldIgnoreScrolling(UIScrollView scrollView) + { + if (s_scrollViewBeingScrolled == null) + return false; + + UIScrollView scrollViewBeingScrolled; + if (!s_scrollViewBeingScrolled.TryGetTarget(out scrollViewBeingScrolled) || ReferenceEquals(scrollViewBeingScrolled, scrollView)) + return false; + + scrollView.SetContentOffset(new PointF(0, 0), false); + return true; + } + protected override void Dispose(bool disposing) { if (_isDisposed) |