diff --git a/Xamarin.Forms.ControlGallery.iOS/CustomRenderers.cs b/Xamarin.Forms.ControlGallery.iOS/CustomRenderers.cs index 706553e37..26029e43b 100644 --- a/Xamarin.Forms.ControlGallery.iOS/CustomRenderers.cs +++ b/Xamarin.Forms.ControlGallery.iOS/CustomRenderers.cs @@ -20,6 +20,7 @@ using RectangleF = CoreGraphics.CGRect; [assembly: ExportRenderer(typeof(TabbedPage), typeof(TabbedPageWithCustomBarColorRenderer))] [assembly: ExportRenderer(typeof(Bugzilla43161.AccessoryViewCell), typeof(AccessoryViewCellRenderer))] [assembly: ExportRenderer(typeof(Bugzilla36802.AccessoryViewCell), typeof(AccessoryViewCellRenderer))] +[assembly: ExportRenderer(typeof(Bugzilla52700.NoSelectionViewCell), typeof(NoSelectionViewCellRenderer))] namespace Xamarin.Forms.ControlGallery.iOS { public class CustomIOSMapRenderer : ViewRenderer @@ -583,5 +584,18 @@ namespace Xamarin.Forms.ControlGallery.iOS return cell; } } + + public class NoSelectionViewCellRenderer : ViewCellRenderer + { + public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv) + { + var cell = base.GetCell(item, reusableCell, tv); + + // remove highlight on selected cell + cell.SelectionStyle = UITableViewCellSelectionStyle.None; + + return cell; + } + } } diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla52700.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla52700.cs new file mode 100644 index 000000000..6415912ff --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla52700.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.ObjectModel; +using System.Linq; +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, 52700, "[iOS] Recycled cell should respect selection style set to none", PlatformAffected.iOS)] + public class Bugzilla52700 : TestContentPage // or TestMasterDetailPage, etc ... + { + const string Instructions = "On iOS, all three of the following ListViews should not change background color upon selection. If the background of the row changes color, this test fails."; + const string ListView1 = "Custom Cell with Context Actions"; + const string ListView2 = "Custom Cell + RecycleElement"; + const string ListView3 = "Custom Cell + RetainElement"; + + public class NoSelectionViewCell : ViewCell + { + public Label label { get; set; } + + public NoSelectionViewCell () + { + label = new Label (); + label.SetBinding (Label.TextProperty, "."); + View = label; + } + } + + public class NoSelectionViewCellWithContextActions : NoSelectionViewCell + { + public NoSelectionViewCellWithContextActions () + { + label = new Label (); + label.SetBinding (Label.TextProperty, "."); + View = label; + + var delete = new MenuItem { Text = "Delete" }; + ContextActions.Add (delete); + } + } + + protected override void Init () + { + var label = new Label { Text = Instructions }; + var selectionLabel = new Label { Text = "<< THIS changes when row selected >>" }; + var listView = new ListView { ItemTemplate = new DataTemplate (typeof (NoSelectionViewCellWithContextActions)), ItemsSource = Enumerable.Range (0, 9), Header = ListView1 }; + var listView2 = new ListView (ListViewCachingStrategy.RecycleElement) { ItemTemplate = new DataTemplate (typeof (NoSelectionViewCell)), ItemsSource = Enumerable.Range (10, 19), Header = ListView2 }; + var listView3 = new ListView { ItemTemplate = new DataTemplate (typeof (NoSelectionViewCell)), ItemsSource = Enumerable.Range (20, 29), Header = ListView3 }; + + listView.ItemSelected += (sender, e) => { + selectionLabel.Text = DateTime.Now.ToLocalTime ().ToString (); + }; + + listView2.ItemSelected += (sender, e) => { + selectionLabel.Text = DateTime.Now.ToLocalTime ().ToString (); + }; + + listView3.ItemSelected += (sender, e) => { + selectionLabel.Text = DateTime.Now.ToLocalTime ().ToString (); + }; + + Content = new StackLayout { Children = { label, selectionLabel, listView, listView2, listView3 } }; + } + } +} 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 61ca0a951..5d2cd7b26 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 @@ -569,6 +569,7 @@ + diff --git a/Xamarin.Forms.Platform.iOS/ContextActionCell.cs b/Xamarin.Forms.Platform.iOS/ContextActionCell.cs index d58219138..45f54340c 100644 --- a/Xamarin.Forms.Platform.iOS/ContextActionCell.cs +++ b/Xamarin.Forms.Platform.iOS/ContextActionCell.cs @@ -251,6 +251,11 @@ namespace Xamarin.Forms.Platform.iOS _scroller.SetContentOffset(new PointF(ScrollDelegate.ButtonsWidth, 0), false); else _scroller.SetContentOffset(new PointF(0, 0), false); + + if (ContentCell != null) + { + SelectionStyle = ContentCell.SelectionStyle; + } } protected override void Dispose(bool disposing)