Table 视图中单元格的动态高度不起作用

Dynamic Height of Cells in Table View Not Working

我创建了一个 table view,它有 6 个标签和 2 个按钮。我正在使用自动版式。我正在从服务器获取数据。

ViewController.cs

public partial class CaseHistoryController : UIViewController
{
    private List<CaseSearchItem> caseSearchItems;
    CaseHistorySourceClass caseSearchSourceclass;

    public CaseHistoryController (IntPtr handle) : base (handle)
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        this.Title = "Case History";

        View.BackgroundColor = UIColor.Clear.FromHexString("#DDDDDD", 1.0f);
        var task = GetCaseHistoryData();
    }

    private async Task GetCaseHistoryData()
    {
        caseSearchItems = await CaseHistoryServices.GetListCaseHistory();
        caseSearchSourceclass = new CaseHistorySourceClass(caseSearchItems);

        CaseHistorySourceClass.RowClicked += (sender, e) =>
        {
            var webController = Storyboard.InstantiateViewController("UserInfoViewController") as UserInfoViewController;
            webController.caseSearchItem = (CaseSearchItem)sender;
            NavigationController.PushViewController(webController, true);
        };
        caseHistoryTableView.Source = caseSearchSourceclass;

        caseHistoryTableView.BackgroundColor = UIColor.Clear.FromHexString("#DDDDDD", 1.0f);
        caseHistoryTableView.SectionHeaderHeight = 0.0f;
        caseHistoryTableView.SectionFooterHeight = 5.0f;
        caseHistoryTableView.ContentInset = new UIEdgeInsets(0, 0, 10.0f, 0);
    }

    public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);
        caseHistoryTableView.ReloadData();
        caseHistoryTableView.RowHeight = UITableView.AutomaticDimension;
        caseHistoryTableView.EstimatedRowHeight = 145.0f;
    }

    public class CaseHistorySourceClass : UITableViewSource
    {
        private List<CaseSearchItem> caseSearchItems;
        public CaseSearchItem caseSearchItem;
        public static event EventHandler RowClicked;
        public CaseHistorySourceClass(List<CaseSearchItem> caseSearchItems)
        {
            this.caseSearchItems = caseSearchItems;
        }
        public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
        {
            CaseHistoryTableCell cell = tableView.DequeueReusableCell(CaseHistoryTableCell.Key) as CaseHistoryTableCell ?? CaseHistoryTableCell.Create();
            var item = caseSearchItems[indexPath.Row];

            cell.BindData(item.Organization, item.Address, item.Doctor, item.UserName);
            cell.Layer.MasksToBounds = false;
            cell.Layer.CornerRadius = 10.0f;
            cell.BackgroundColor = UIColor.White;
            return cell;
        }

        public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
        {
            caseSearchItem = caseSearchItems[indexPath.Row];
            tableView.DeselectRow(indexPath, true);
            if (RowClicked != null)
                RowClicked(caseSearchItem, EventArgs.Empty);
        }

        public override nint RowsInSection(UITableView tableview, nint section)
        {
            return caseSearchItems.Count;
        }
    }

}

TableViewCell.cs

public partial class CaseHistoryTableCell : UITableViewCell
{
     public static readonly NSString Key = new NSString("CaseHistoryTableCell");
     public static readonly UINib Nib;

     static CaseHistoryTableCell()
     {
          Nib = UINib.FromName("CaseHistoryTableCell", NSBundle.MainBundle);
     }

     public CaseHistoryTableCell(IntPtr handle) : base(handle)
     {
         // Note: this .ctor should not contain any initialization logic.
     }

     public static CaseHistoryTableCell Create()
     {
         return (CaseHistoryTableCell)Nib.Instantiate(null, null)[0];
     }

     public void BindData(string hospitalLabel, string addressLabel, string drLabel, string patientLabel)
     {
         this.lbl_hospitalName.Text = hospitalLabel;
         this.lbl_address.Text = addressLabel;

         this.lbl_drName.Text = drLabel;
         this.lbl_patientName.Text = patientLabel;

         this.lbl_address.TextColor = UIColor.Clear.FromHexString("#000000", 0.54f);
         this.lbl_patientName.TextColor = UIColor.Clear.FromHexString("#000000", 0.54f);
         this.lbl_hospitalName.TextColor = UIColor.Clear.FromHexString("#000000", 0.87f);
         this.lbl_drName.TextColor = UIColor.Clear.FromHexString("#000000", 0.87f);
            this.btn_createAppointment.SetTitleColor(UIColor.Clear.FromHexString("#0072BA", 1.0f), UIControlState.Normal);
            this.btn_viewDetail.SetTitleColor(UIColor.Clear.FromHexString("#0072BA", 1.0f), UIControlState.Normal);

       }

       public override CGRect Frame
       {
            get
            {
                return base.Frame;
            }

            set
            {
                value.Y += 4;
                value.Height -= 2 * 4;
                base.Frame = value;
            }
      }

 }

我想要的是:

我想使所有单元格高度动态化。但是每次,第二个单元格都没有进行调整。

我试过的:

1.)

ViewDidAppear中,我设置如下:

public override void ViewWillAppear(bool animated)
{
    base.ViewWillAppear(animated);
    caseHistoryTableView.ReloadData();
    caseHistoryTableView.RowHeight = UITableView.AutomaticDimension;
    caseHistoryTableView.EstimatedRowHeight = 145.0f;
}

2.)

GetCell方法中,我这样添加单元格:

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
    CaseHistoryTableCell cell = tableView.DequeueReusableCell(CaseHistoryTableCell.Key) as CaseHistoryTableCell ?? CaseHistoryTableCell.Create();
    var item = caseSearchItems[indexPath.Row];
    cell.BindData(item.Organization, item.Address, item.Doctor, item.UserName);

    cell.Layer.MasksToBounds = false;
    cell.Layer.CornerRadius = 10.0f;
    cell.BackgroundColor = UIColor.White;
    cell.SetNeedsLayout();
    cell.LayoutIfNeeded();
    return cell;
}

但我的输出仍然低于:


第二个单元格不取自动高度

标签 1 约束:(医院标签)

标签 2 约束:(地址标签)

只需根据将显示在那里的字符串大小计算标签的高度,只需添加以下方法即可获取高度并相应地管理标签大小。

 func heightForWithFont(font: UIFont, width: CGFloat, insets: UIEdgeInsets) -> CGFloat {

        let label:UILabel = UILabel(frame: CGRect(x:0, y:0, width: width + insets.left + insets.right, height: CGFloat.greatestFiniteMagnitude))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.byWordWrapping
        label.font = font
        label.sizeToFit()
        return label.frame.height + insets.top + insets.bottom
    }

希望有用:)

添加两个标签的高度,根据您对单行高度的要求,现在添加两个约束的关系从equalto(=)greaterthanorequalto(>=)

见下图。

现在 运行 并重新检查,如果现在遇到任何问题请告诉我。