How to resize UITableViewCell to fit its content?

前端 未结 8 765
有刺的猬
有刺的猬 2020-12-08 05:34

I have a UITableview with multiple reusable TableViewCells. In one cell I have a UITextView, that resizes itself to fit its content. Now I \"just\

8条回答
  •  一个人的身影
    2020-12-08 05:34

    You can only resize a UITableViewCell in tableView:heightForRowAtIndexPath: delegate method.

    You have to estimate what the size of the text will be when that method is called for every row when the tableView is loaded.

    This is what I did to solve the problem.

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
     {
         NSString * yourText = self.myArrayWithTextInIt[indexPath.row]; // or however you are getting the text
         return additionalSpaceNeeded + [self heightForText:yourText];
     }
    
     -(CGFloat)heightForText:(NSString *)text
     {
       NSInteger MAX_HEIGHT = 2000;
       UITextView * textView = [[UITextView alloc] initWithFrame: CGRectMake(0, 0, WIDTH_OF_TEXTVIEW, MAX_HEIGHT)];
       textView.text = text;
       textView.font = // your font
       [textView sizeToFit];
       return textView.frame.size.height;
      }
    

    EDIT

    While I used this solution for a while, I found a more optimal one that I would recommend using as it doesn't require allocating an entire textView in order to work, and can handle text greater than 2000.

    -(CGFloat)heightForTextViewRectWithWidth:(CGFloat)width andText:(NSString *)text
    {
        UIFont * font = [UIFont systemFontOfSize:12.0f];
    
        // this returns us the size of the text for a rect but assumes 0, 0 origin
        CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: font}];
    
        // so we calculate the area
        CGFloat area = size.height * size.width;
    
        CGFloat buffer = whateverExtraBufferYouNeed.0f;
    
        // and then return the new height which is the area divided by the width
        // Basically area = h * w
        // area / width = h
        // for w we use the width of the actual text view
        return floor(area/width) + buffer;
    }
    

提交回复
热议问题