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

Posted

技术标签:

【中文标题】表格视图中单元格的动态高度不起作用【英文标题】:Dynamic Height of Cells in Table View Not Working 【发布时间】:2016-12-23 03:58:47 【问题描述】:

我创建了一个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 约束:(地址标签)

【问题讨论】:

整个事情都可以由autolayouttableviewdelegates管理 @TinuDahiya 正如我在我的问题中所说,我正在使用autoLayout 但它不起作用,请再次查看问题。 将标签高度关系从equalto(=)更改为greaterthatequalto(&gt;=)。而且我已经阅读了您的问题,任何约束都必须存在问题。 您是否在情节提要中设置了 numberOfLine = 0?您能否分享一下您的自动布局屏幕截图。 @DheerajD 是的,我已经在storyboard 中设置了。 【参考方案1】:

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

见下图。

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

【讨论】:

等我试试,很快就会回来。 不要忘记您的标签行属性是故事板中的 0。您在原型单元格中拥有的每个标签和视图都必须根据那里的层次结构具有顶部和底部约束。如果所有这些组件都在 UIView 中,那么用那个 UIView @Ironman 给出关系高度【参考方案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
    

希望它有效:)

【讨论】:

您必须计算所有标签的高度,然后将它们加在一起并将其传递给 heightForRowAtIndexPath, 在初始化单元格之前调用cellForRow中的heightForWithFont方法

以上是关于表格视图中单元格的动态高度不起作用的主要内容,如果未能解决你的问题,请参考以下文章

动态单元格高度大小不起作用

自我调整大小的表格视图单元格不起作用

使用固定大小的子视图和自动布局调整 UIView 的大小不起作用

TableViewCell 中的动态高度不起作用

表格视图的辅助功能不起作用

使用动态单元格高度时将表格视图滚动到底部