Причина:
На самом деле, автоматическая высота с HasUnevenRows=true
отлично работает на iOS, если не использует пользовательский рендер.
Если используется пользовательский рендерер, то зависит от рендерера, чтобы установить высоту ячейки , но в действительности вы должны сделать это в GetHeightForRow переопределении UITableViewSource .
Это означает, что вам нужно вычислить высоту строки в UITableViewSource
, который вы задаете, чтобы установить высоту строки в GetHeightForRows
override
, если вы хотите использовать пользовательский рендеринг видовой ячейки в listView с неровными строками.
Решение:
В основном вы должны сделать кастом ListView renderer
. Затем вы должны получить свойство UITableView's
Source (Control.Source в визуализаторе представления списка) и передать его новому созданному вами экземпляру подкласса UITableVIewSource
, а затем переопределить все методы UITableViewSource
, чтобы Вы можете вызывать исходные методы источника, когда вы не хотите ничего менять, но для метода GetRowForHeight вы бы вернули желаемую высоту для этой строки. E.G.:
[assembly: ExportRenderer(typeof(ListView), typeof(MyLVRenderer))]
public class MyLVRenderer : ListViewRenderer
{
//UITableViewSource originalSource;
protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
{
base.OnElementChanged(e);
UITableViewSource originalSource = (UIKit.UITableViewSource)Control.Source;
Control.Source = new MyLVSource(originalSource);
}
}
public class MyLVSource : UITableViewSource
{
UITableViewSource originalSource;
public MyLVSource(UITableViewSource origSource)
{
originalSource = origSource;
}
public override nint RowsInSection(UITableView tableview, nint section)
{
return originalSource.RowsInSection(tableview, section);
}
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
return originalSource.GetCell(tableView, indexPath);
}
public override nfloat GetHeightForFooter(UITableView tableView, nint section)
{
return originalSource.GetHeightForFooter(tableView, section);
}
public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
{
nfloat origHeight = originalSource.GetHeightForRow(tableView, indexPath);
// calculate your own row height here
return origHeight + (indexPath.Row +1) * 10;
}
}
Это пример увеличения высоты строки на десять для каждой строки. Вы должны рассчитать собственную высоту строки самостоятельно. Я могу поделиться с вами демо, если вам нужно.
См .: Viewcell