Dynamic Height Issue for UITableView Cells (Swift)

前端 未结 25 2531
温柔的废话
温柔的废话 2020-11-28 04:39

Dynamic text of variable length are being injected into tableview cell labels. In order for the tableview cells\' heights to be dynamically sized, I have implemented in

相关标签:
25条回答
  • 2020-11-28 05:01

    This strange bug was solved through Interface Builder parameters as the other answers did not resolve the issue.

    All I did was make the default label size larger than the content potentially could be and have it reflected in the estimatedRowHeight height too. Previously, I set the default row height in Interface Builder to 88px and reflected it like so in my controller viewDidLoad():

    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.estimatedRowHeight = 88.0
    

    But that didn't work. So I realized that content wouldn't ever become larger than maybe 100px, so I set the default cell height to 108px (larger than the potential content) and reflected it like so in the controller viewDidLoad():

    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.estimatedRowHeight = 108.0
    

    This actually allowed the code to shrink down the initial labels to the correct size. In other words, it never expanded out to a larger size, but could always shrink down... Also, no additional self.tableView.reloadData() was needed in viewWillAppear().

    I know this does not cover highly variable content sizes, but this worked in my situation where the content had a maximum possible character count.

    Not sure if this is a bug in Swift or Interface Builder but it works like a charm. Give it a try!

    0 讨论(0)
  • 2020-11-28 05:01

    When using a static UITableView, I set all the values in the UILabels and then call tableView.reloadData().

    0 讨论(0)
  • 2020-11-28 05:03

    Use this:

    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 300
    

    and don't use: heightForRowAtIndexPath delegate function

    Also, in the storyboard don't set the height of the label that contains a large amount of data. Give it top, bottom, leading, trailing constraints.

    0 讨论(0)
  • 2020-11-28 05:03

    For Swift i checked this answer in iOS 9.0 and iOS 11 also (Xcode 9.3)

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
    
    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
    

    Here you need to add top, bottom, right and left constraints

    0 讨论(0)
  • 2020-11-28 05:03

    Set proper constraint and update delegate methods as:

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
    

    This will resolve dynamic cell height issue. IF not you need to check constraints.

    0 讨论(0)
  • 2020-11-28 05:05

    For objective c this is one of my nice solution. it's worked for me.

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        cell.textLabel.text = [_nameArray objectAtIndex:indexPath.row];
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        return UITableViewAutomaticDimension;
    }
    

    We need to apply these 2 changes.

    1)cell.textLabel.numberOfLines = 0;
      cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    
    2)return UITableViewAutomaticDimension;
    
    0 讨论(0)
提交回复
热议问题