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 | |
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
3 files changed, 89 insertions, 4 deletions
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla43735.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla43735.cs new file mode 100644 index 00000000..5f247eaf --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla43735.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; + +#if UITEST +using Xamarin.UITest; +using NUnit.Framework; +#endif + +namespace Xamarin.Forms.Controls.Issues +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Bugzilla, 43735, "Multiple Swipe on ContextActions", PlatformAffected.iOS)] + public class Bugzilla43735 : TestContentPage // or TestMasterDetailPage, etc ... + { + protected override void Init() + { + var stackLayout = new StackLayout(); + + var l = new Label + { + Text = "Swipe multiple cells at the same time. Only one cell should show its context actions." + }; + stackLayout.Children.Add(l); + + var list = new List<int>(); + for (var i = 0; i < 20; i++) + list.Add(i); + + var listView = new ListView + { + ItemsSource = list, + ItemTemplate = new DataTemplate(() => + { + var label = new Label(); + label.SetBinding(Label.TextProperty, new Binding(".")); + + return new ViewCell + { + View = new ContentView + { + Content = label, + }, + ContextActions = { new MenuItem + { + Text = "Action" + }, + new MenuItem + { + Text = "Delete", + IsDestructive = true + } } + }; + }) + }; + stackLayout.Children.Add(listView); + + Content = stackLayout; + } + } +}
\ No newline at end of file diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems index c5d93821..4820bae3 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems @@ -139,6 +139,7 @@ <Compile Include="$(MSBuildThisFileDirectory)Bugzilla43469.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla43516.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla43663.cs" /> + <Compile Include="$(MSBuildThisFileDirectory)Bugzilla43735.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla44453.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla44944.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Bugzilla44166.cs" /> 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) |