gpt4 book ai didi

c# - Xamarin Forms iOS 自定义 UITableViewCell 动态高度

转载 作者:行者123 更新时间:2023-11-29 00:05:46 25 4
gpt4 key购买 nike

我正在尝试为 Xamarin Forms 创建自定义 UITableViewCell,它将根据它包含的文本自动调整它的高度。

我找到了通过 Designer 制定的解决方案,但我需要在代码中完成。

这是我在分析 Designer 解决方案后得到的结果,但它不起作用:

public class FormLabelCellView : UITableViewCell, INativeElementView
{
public UILabel Label { get; private set; }
public FormLabelCell Cell { get; set; }
public Element Element => Cell;

public FormLabelCellView(FormLabelCell cell) : base(UITableViewCellStyle.Default, cell.GetType().FullName)
{
Cell = cell;
// in the custom ContentView solution I can't set the cell to expand and contract according to the text it contains
Label = new UILabel();

Label.TranslatesAutoresizingMaskIntoConstraints = false;
Label.SetContentCompressionResistancePriority(751, UILayoutConstraintAxis.Vertical);
Label.SetContentHuggingPriority(251, UILayoutConstraintAxis.Vertical);

this.ContentView.AddSubview(Label);

this.ContentView.AddConstraint(NSLayoutConstraint.Create(Label, NSLayoutAttribute.Left, NSLayoutRelation.Equal, this.ContentView, NSLayoutAttribute.Left, 1, 0));
this.ContentView.AddConstraint(NSLayoutConstraint.Create(Label, NSLayoutAttribute.Right, NSLayoutRelation.Equal, this.ContentView, NSLayoutAttribute.Right, 1, 0));
this.ContentView.AddConstraint(NSLayoutConstraint.Create(Label, NSLayoutAttribute.Top, NSLayoutRelation.Equal, this.ContentView, NSLayoutAttribute.Top, 1, 0));
this.ContentView.AddConstraint(NSLayoutConstraint.Create(Label, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, this.ContentView, NSLayoutAttribute.Bottom, 1, 0));
}
}

这是结果(行高大概是DefaultRowHeight of 44):

custom ContentView solution

在任何人询问RowHeightEstimatedRowHeight 之前。是的,我在我的自定义 ListViewRenderer 中设置了 RowHeight = UITableView.AutomaticDimension;EstimatedRowHeight = 24;

当我修改我的自定义 UITableViewCell 时,我还可以验证它是否有效:

public class FormLabelCellView : UITableViewCell, INativeElementView
{
public UILabel Label { get; private set; }
public FormLabelCell Cell { get; set; }
public Element Element => Cell;

public FormLabelCellView(FormLabelCell cell) : base(UITableViewCellStyle.Default, cell.GetType().FullName)
{
Cell = cell;
// this solution works, but I can't remove the margins / padding and set background color
Label = this.TextLabel;
}
}

然后结果是这样的:

using TextLabel

我认为我没有正确创建约束。有人可以帮助我吗?

编辑:在尝试为测试目的创建自定义 UITableViewSource 后,我发现问题出在 ListViewDataSourceUnevenListViewDataSource 的 Xamarin 实现中。这很不幸,因为这些类是内部类,所以我无法扩展它们并覆盖 GetHeightForRow 函数。

最佳答案

在我的测试中,如果我在 listViewRenderer 中设置 RowHeight = UITableView.AutomaticDimension;EstimatedRowHeight = 24;,我将得到与您显示的相同的效果: TableView 似乎具有相同的行高。

但是当我尝试使用另一种方式时:在 tableView 的源中使用重写方法,例如:

public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
{
return UITableView.AutomaticDimension;
}

public override nfloat EstimatedHeight(UITableView tableView, NSIndexPath indexPath)
{
return 24;
}

它工作正常(单元格将在运行时自动调整其行高)。

此外,我强烈建议您使用此方法来构建您的 Cell:

public MyListViewCell(NSString cellId) : base(UITableViewCellStyle.Default, cellId)
{
//add your controls in the cell's ContentView
}

然后我们可以在源中使用它,例如:

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
MyListViewCell cell = tableView.DequeueReusableCell("Cell") as MyListViewCell;

if (cell == null)
{
cell = new MyListViewCell(new NSString("Cell"));
}

//Update your data

return Cell;
}

关于c# - Xamarin Forms iOS 自定义 UITableViewCell 动态高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48093371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com