Dynamic Height of Cells in Table View Not Working

1k views Asked by At

I have created one table view, which has 6 labels and 2 buttons. I am using autolayout. And I am getting data from the server.

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;
            }
      }

 }

What I want is:

I want to make all cell height dynamic. But every time, the second cell is not taking adjustment.

What I have tried:

1.)

In ViewDidAppear, I set the following:

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

2.)

In GetCell method, I add the cells this way:

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;
}

But I still get below output:


The second cell in not taking automatic height.

enter image description here

Label 1 constraint :(hospital Label)

enter image description here

Label 2 constaint :(Address Label)

enter image description here

2

There are 2 answers

2
dahiya_boy On BEST ANSWER

Add height of the both labels, as per the your requirement for single line height, now add relationship for both the constraints from equalto(=) to greaterthanorequalto(>=)

see below image.

enter image description here

Now Run and recheck, if face any problem now than let me know.

2
Aman Gangurde On

Just calculate the height of label according to the string size which will be shown up there, just add the below method by which you will get the height and manage the label size accordingly.

 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
    }

Hope it works:)