Автоматическая высота ViewCell в формах Xamarin на iOS с помощью ViewCellRenderer - PullRequest
1 голос
/ 13 марта 2019

По соображениям производительности я решил написать собственный ViewCell для своего ListView в Xamarin Forms. Для этого ViewCell я расширил ViewCellRenderer для iOS. В методе GetCell я создаю новый экземпляр расширенного UITableViewCell, который создает некоторые метки и изображения и упорядочивает их по некоторым ограничениям для якорей.

ListView в формах Xamarin имеет HasUnevenRows = "True", но все строки обрезаются по 44px. Как я могу получить автоматическую высоту строк по созданному содержимому из пользовательского UITableViewCell?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Причина:

На самом деле, автоматическая высота с 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

0 голосов
/ 13 марта 2019

Вы должны переопределить LayoutSubviews.Вы должны установить renderer.NativeView.Frame на правильные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...