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