В этом нет ничего нового с Xamarin Forms iOS. Это было давно, и, если честно, я не уверен, что Xamarin когда-либо предлагал правильное (эффективное) решение, но если оно существует, то проигнорируйте следующее. : -)
Это существовало некоторое время ...
https://developer.xamarin.com/samples/xamarin-forms/UserInterface/ListView/DynamicUnevenListCells/
... но всегда был действительно неэффективный подход. Стоит попробовать, в противном случае я преодолел это, создав собственный рендер.
Пользовательский контроль
using System;
using Xamarin.Forms;
namespace YourApplication.Controls
{
public class CustomListView : ListView
{
public event EventHandler<int> ItemHeightChangedEvent;
public void ItemHeightChanged(int index)
{
ItemHeightChangedEvent?.Invoke(this, index);
}
}
}
Пользовательский рендерер iOS
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using UIKit;
using System.ComponentModel;
using YourApplication.Controls;
using Foundation;
[assembly: ExportRenderer(typeof(CustomListView), typeof(YourApplication.iOS.CustomListViewRenderer))]
namespace YourApplication.iOS
{
public class CustomListViewRenderer : ListViewRenderer
{
private CustomListView _formsListView;
protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
{
base.OnElementChanged(e);
_formsListView = Element as CustomListView;
if (_formsListView == null)
return;
_formsListView.ItemHeightChangedEvent += async (object sender, int index) =>
{
Control.ReloadRows(new NSIndexPath[] { NSIndexPath.FromRowSection(index, 0) }, UITableViewRowAnimation.Automatic);
};
}
}
}
XAML
<localControls:CustomListView ItemsSource="{Binding Source}" ... >
Вам нужно будет прочитать о создании пользовательских средств визуализации (если вы еще не знакомы с их использованием), а затем все, что вам нужно сделать, это вызвать метод ItemHeightChanged
для элемента, когда клеточные изменения.
Производительность может быть сомнительной (поэтому стоит атаковать только те элементы, которые изменились), но у меня это сработало.
Надеюсь, это имеет смысл, и, более того, надеюсь, это поможет.