diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Views/Expander/ExpanderPage.xaml b/samples/CommunityToolkit.Maui.Sample/Pages/Views/Expander/ExpanderPage.xaml index 062a939e23..89c2bae6ea 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Views/Expander/ExpanderPage.xaml +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Views/Expander/ExpanderPage.xaml @@ -95,6 +95,33 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/CommunityToolkit.Maui/Views/Expander/Expander.macios.cs b/src/CommunityToolkit.Maui/Views/Expander/Expander.macios.cs index 2f4de89d11..6d88d08fd5 100644 --- a/src/CommunityToolkit.Maui/Views/Expander/Expander.macios.cs +++ b/src/CommunityToolkit.Maui/Views/Expander/Expander.macios.cs @@ -1,5 +1,5 @@ -using System.Reflection; using CoreGraphics; +using Microsoft.Maui.Controls.Handlers.Items; using UIKit; namespace CommunityToolkit.Maui.Views; @@ -15,36 +15,19 @@ static void ForceUpdateCellSize(CollectionView collectionView, Size size, Point? var controller = GetController(collectionView); - if (controller?.CollectionView.CollectionViewLayout is UICollectionViewFlowLayout layout) + if (controller?.CollectionView.CollectionViewLayout is ListViewLayout listViewLayout) { - var cells = layout.CollectionView.VisibleCells.OrderBy(x => x.Frame.Y).ToArray(); - var clickedCell = GetCellByPoint(cells, new CGPoint(tapLocation.Value.X, tapLocation.Value.Y)); - if (clickedCell is null) - { - return; - } - - for (int i = 0; i < cells.Length; i++) - { - var cell = cells[i]; - - if (i > 0) - { - var prevCellFrame = cells[i - 1].Frame; - cell.Frame = new CGRect(cell.Frame.X, prevCellFrame.Y + prevCellFrame.Height, cell.Frame.Width, cell.Frame.Height); - } - - if (cell.Equals(clickedCell)) - { - cell.Frame = new CGRect(cell.Frame.X, cell.Frame.Y, cell.Frame.Width, size.Height); - } - } + UpdateListLayout(listViewLayout, tapLocation.Value, size); + } + else if (controller?.CollectionView.CollectionViewLayout is GridViewLayout gridViewLayout) + { + UpdateGridLayout(collectionView, gridViewLayout, tapLocation.Value, size); } } static UICollectionViewController? GetController(CollectionView collectionView) { - var handler = collectionView.Handler as Microsoft.Maui.Controls.Handlers.Items.CollectionViewHandler; + var handler = collectionView.Handler as CollectionViewHandler; return handler?.Controller; } @@ -52,4 +35,73 @@ static void ForceUpdateCellSize(CollectionView collectionView, Size size, Point? { return cells.FirstOrDefault(cell => cell.Frame.Contains(point)); } + + static void UpdateListLayout(UICollectionViewLayout layout, Point tapLocation, Size size) + { + var cells = layout.CollectionView.VisibleCells.OrderBy(x => x.Frame.Y).ToArray(); + var clickedCell = GetCellByPoint(cells, new CGPoint(tapLocation.X, tapLocation.Y)); + if (clickedCell is null) + { + return; + } + + for (int i = 0; i < cells.Length; i++) + { + var cell = cells[i]; + + if (i > 0) + { + var prevCellFrame = cells[i - 1].Frame; + cell.Frame = new CGRect(cell.Frame.X, prevCellFrame.Y + prevCellFrame.Height, cell.Frame.Width, cell.Frame.Height); + } + + if (cell.Equals(clickedCell)) + { + cell.Frame = new CGRect(cell.Frame.X, cell.Frame.Y, cell.Frame.Width, size.Height); + } + } + } + + static void UpdateGridLayout(CollectionView gridView, GridViewLayout gridViewLayout, Point tapLocation, Size size) + { + var numberOfColumns = ((GridItemsLayout)gridView.ItemsLayout).Span; + if (numberOfColumns == 0) + { + return; + } + + var cells = gridViewLayout.CollectionView.VisibleCells.OrderBy(x => x.Frame.Y).ThenBy(x=>x.Frame.X).ToArray(); + var clickedCell = GetCellByPoint(cells, new CGPoint(tapLocation.X, tapLocation.Y)); + if (clickedCell is null) + { + return; + } + + for (int i = 0; i < cells.Length; i++) + { + var cell = cells[i]; + if (cell.Equals(clickedCell)) + { + IterateItemsInRow(cells, i, numberOfColumns, size.Height); + } + } + } + + static void IterateItemsInRow(IReadOnlyList cells, int itemIndex, int totalColumns, double height) + { + var rowToIterate = itemIndex / totalColumns; + var startIndex = rowToIterate * totalColumns; + + double y = 0; + for (var i = startIndex; i < startIndex + totalColumns; i++) + { + var cell = cells[i]; + if (i == startIndex) + { + y = cell.Frame.Y; + } + + cell.Frame = new CGRect(cell.Frame.X, y, cell.Frame.Width, height); + } + } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui/Views/Expander/Expander.windows.cs b/src/CommunityToolkit.Maui/Views/Expander/Expander.windows.cs index 5f83587d8c..54dca58303 100644 --- a/src/CommunityToolkit.Maui/Views/Expander/Expander.windows.cs +++ b/src/CommunityToolkit.Maui/Views/Expander/Expander.windows.cs @@ -1,4 +1,3 @@ -using CommunityToolkit.Maui.Core.Extensions; using Microsoft.Maui.Controls.Platform; using Microsoft.UI.Xaml.Controls; @@ -30,5 +29,48 @@ static void ForceUpdateCellSize(CollectionView collectionView, Size size, Point? } } } + else if (collectionView.Handler?.PlatformView is FormsGridView gridView) + { + var numberOfColumns = gridView.Span; + if (numberOfColumns == 0) + { + return; + } + + for (var i = 0; i < gridView.Items.Count; i++) + { + if (gridView.ContainerFromIndex(i) is GridViewItem gridViewItem) + { + var itemTransform = gridViewItem.TransformToVisual(gridView); + var itemPosition = itemTransform.TransformPoint(new Windows.Foundation.Point(0, 0)); + var itemBounds = new Rect(itemPosition.X, itemPosition.Y, gridViewItem.ActualWidth, gridViewItem.ActualHeight); + + if (itemBounds.Contains(tapLocation.Value)) + { + IterateItemsInRow(gridView, i, numberOfColumns, size.Height); + break; + } + } + } + } + } + + static void IterateItemsInRow(ItemsControl gridView, int itemIndex, int totalColumns, double height) + { + var rowToIterate = itemIndex / totalColumns; + var startIndex = rowToIterate * totalColumns; + + for (var i = startIndex; i < startIndex + totalColumns; i++) + { + if (i >= gridView.Items.Count) + { + break; + } + + if (gridView.ContainerFromIndex(i) is GridViewItem cell) + { + cell.Height = height + Random.Shared.NextDouble(); + } + } } } \ No newline at end of file