From 5ad5752f3c859efdc08220f79d26e6b77b88de5a Mon Sep 17 00:00:00 2001 From: "E.Z. Hart" Date: Tue, 13 Dec 2016 14:33:49 -0700 Subject: Disable using EstimatedRowHeight for uneven rows with known heights (#454) --- .../Renderers/ListViewRenderer.cs | 54 +++++++++++++++++----- 1 file changed, 43 insertions(+), 11 deletions(-) (limited to 'Xamarin.Forms.Platform.iOS') diff --git a/Xamarin.Forms.Platform.iOS/Renderers/ListViewRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/ListViewRenderer.cs index 39136327..89001cc8 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/ListViewRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/ListViewRenderer.cs @@ -24,6 +24,7 @@ namespace Xamarin.Forms.Platform.iOS RectangleF _previousFrame; ScrollToRequestedEventArgs _requestedScroll; bool _shouldEstimateRowHeight = true; + FormsUITableViewController _tableViewController; IListViewController Controller => Element; ITemplatedItemsView TemplatedItemsView => Element; @@ -327,6 +328,7 @@ namespace Xamarin.Forms.Platform.iOS var position = GetScrollPosition(e.Position); var scrollArgs = (ITemplatedItemsListScrollToRequestedEventArgs)e; + var templatedItems = TemplatedItemsView.TemplatedItems; if (Element.IsGroupingEnabled) { @@ -338,7 +340,10 @@ namespace Xamarin.Forms.Platform.iOS { var index = templatedItems.GetGlobalIndexOfItem(scrollArgs.Item); if (index != -1) + { + Control.Layer.RemoveAllAnimations(); Control.ScrollToRow(NSIndexPath.FromRowSection(index, 0), position, e.ShouldAnimate); + } } } @@ -353,11 +358,9 @@ namespace Xamarin.Forms.Platform.iOS var source = _dataSource as UnevenListViewDataSource; if (_shouldEstimateRowHeight) { - var templatedItems = TemplatedItemsView.TemplatedItems; - if (templatedItems.Count > 0 && source != null) + if (source != null) { - var estimatedHeightFromFirstCell = source.CalculateHeightForCell(Control, templatedItems.First()); - Control.EstimatedRowHeight = estimatedHeightFromFirstCell; + Control.EstimatedRowHeight = source.GetEstimatedRowHeight(Control); _estimatedRowHeight = true; } else @@ -482,12 +485,13 @@ namespace Xamarin.Forms.Platform.iOS switch (e.Action) { case NotifyCollectionChangedAction.Add: + UpdateEstimatedRowHeight(); if (e.NewStartingIndex == -1 || groupReset) goto case NotifyCollectionChangedAction.Reset; + Control.BeginUpdates(); Control.InsertRows(GetPaths(section, e.NewStartingIndex, e.NewItems.Count), UITableViewRowAnimation.Automatic); - Control.EndUpdates(); break; @@ -560,11 +564,9 @@ namespace Xamarin.Forms.Platform.iOS void UpdateRowHeight() { var rowHeight = Element.RowHeight; - if (Element.HasUnevenRows && rowHeight == -1 && Forms.IsiOS7OrNewer) - { - if (Forms.IsiOS8OrNewer) - Control.RowHeight = UITableView.AutomaticDimension; - } + + if (Element.HasUnevenRows && rowHeight == -1 && Forms.IsiOS8OrNewer) + Control.RowHeight = UITableView.AutomaticDimension; else Control.RowHeight = rowHeight <= 0 ? DefaultRowHeight : rowHeight; } @@ -606,6 +608,36 @@ namespace Xamarin.Forms.Platform.iOS { } + internal nfloat GetEstimatedRowHeight(UITableView table) + { + if (List.RowHeight != -1) + { + // Not even sure we need this case; A list with HasUnevenRows and a RowHeight doesn't make a ton of sense + // Anyway, no need for an estimate, because the heights we'll use are known + return 0; + } + + var templatedItems = TemplatedItemsView.TemplatedItems; + + if (templatedItems.Count == 0) + { + // No cells to provide an estimate, use the default row height constant + return DefaultRowHeight; + } + + // We're going to base our estimate off of the first cell + var firstCell = templatedItems.First(); + + if (firstCell.Height > 0) + { + // Seems like we've got cells which already specify their height; since the heights are known, + // we don't need to use estimatedRowHeight at all; zero will disable it and use the known heights + return 0; + } + + return CalculateHeightForCell(table, firstCell); + } + public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath) { var cell = GetCellForPath(indexPath); @@ -662,7 +694,7 @@ namespace Xamarin.Forms.Platform.iOS readonly FormsUITableViewController _uiTableViewController; protected readonly ListView List; IListViewController Controller => List; - ITemplatedItemsView TemplatedItemsView => List; + protected ITemplatedItemsView TemplatedItemsView => List; bool _isDragging; bool _selectionFromNative; -- cgit v1.2.3