Get tableView:heightForRowAtIndexPath: to happen after tableView:cellForRowAtIndexPath:?

前端 未结 3 684
無奈伤痛
無奈伤痛 2020-12-14 20:58

I\'ve got some UITableViewCells that need to change their height depending on the length of the strings inside. I\'m calculating the necessary height inside tableView:

相关标签:
3条回答
  • 2020-12-14 21:04

    You could just set self.numberOfLines to 0 once and it would work the same. (If numberOfLines is set to 0 then the label uses as many rows as are needed.)

    0 讨论(0)
  • 2020-12-14 21:06

    My solution was to call the tableView:cellForRowAtIndexPath: inside the implementation of tableView:heightForRowAtIndexPath: as following

    - (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    
       [self tableView:aTableView cellForRowAtIndexPath:indexPath];
       return headerHeight;
    }
    
    0 讨论(0)
  • 2020-12-14 21:13

    Gonna answer my own question here:

    Originally I was pretty sure that the height calculations were tied to the tableView:cellForRowAtIndexPath: method, and couldn't be moved elsewhere. With a bunch of restructuring, though, I was able to get that stuff out of there and into tableView:heightForRowAtIndexPath:, which solves everything.

    For anyone else who's trying to get auto-height-adjusted cells to work, here's some code that might help:

    // Inside tableView:cellForRowAtIndexPath:
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = self.numberOfTextRows;
    // numberOfTextRows is an integer, declared in the class
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        CGSize theSize = [theObject.theStringToDisplay sizeWithFont:[UIFont systemFontOfSize:18.0f] constrainedToSize:CGSizeMake(265.0f, 9999.0f) lineBreakMode:UILineBreakModeWordWrap];
        // This gets the size of the rectangle needed to draw a multi-line string
        self.numberOfTextRows = round(theSize.height / 18);
        // 18 is the size of the font used in the text label
        // This will give us the number of lines in the multi-line string
    
        if ((indexPath.section == FIXED_HEIGHT_SECTION) || (self.numberOfTextRows < 2)) {
            return 44;
            // 44 is the default row height; use it for empty or one-line cells (or in other table sections)
        } else {
            return theSize.height + 16;
            // 16 seems to provide a decent space above/below; tweak to taste
        }
    }
    

    If you can think of a more accurate way to calculate the proper cell height, I'm all ears. :)

    0 讨论(0)
提交回复
热议问题