在 iOS8 中使用自动布局时如何修复 UITextView 溢出?

How to fix UITextView overflow when using autolayout in iOS8?

我正在使用自动版式并有一个包含 UITextView 的自定义 UITableViewCell。单元格和文本视图的 高度动态调整大小 以容纳更大的内容。

根据这些链接的回答 resize ui text view to its contentdynamic ui text view,我在文本视图上使用了 高度约束 并将其值设置为内容的高度。这完成了容纳 textView 的工作,但它 超出了单元格 。我也尝试过调整单元格大小等选项,但其中 none 有帮助。令人惊讶的是,sizeToFit似乎没有效果。 这是我使用的代码:

+ (SongAdditionalTextCell *)resize:(SongAdditionalTextCell *)additionalTextCell{
UITextView *textView = additionalTextCell.additionalText;
CGSize sizeThatFitsTextView = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, MAXFLOAT)];
NSLog(@"content height is %f, frame height is %f", textView.contentSize.height, textView.frame.size.height );
additionalTextCell.addnlTextHeightConstraint.constant = sizeThatFitsTextView.height;
return additionalTextCell;
}

请查看视图的附件图片(文本视图是第二个单元格)。有什么建议吗?

试试这个对我有用

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
 {
     CGSize labelSize = [[[Array objectAtIndex:indexPath.row] valueForKey:@"detail"] sizeWithFont:[UIFont boldSystemFontOfSize:10]  constrainedToSize:CGSizeMake(255, MAXFLOAT)                                                                                         lineBreakMode:NSLineBreakByWordWrapping];
     return labelSize.height +15;
  }

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
     static NSString *simpletableidentifier=@"simpletableidentifier";
     UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:simpletableidentifier];
     if(cell == nil)
     {
        cell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:simpletableidentifier];

         CGSize labelSize = [[[Array objectAtIndex:indexPath.row] valueForKey:@"detail"] sizeWithFont:[UIFont boldSystemFontOfSize:10]  constrainedToSize:CGSizeMake(255, MAXFLOAT)                                                                                         lineBreakMode:NSLineBreakByWordWrapping];

          UILabel *desc=[[UILabel alloc]initWithFrame:CGRectMake(35,2,245,labelSize.height)];
          desc.backgroundColor=[UIColor clearColor];
          desc.tag=2;
          desc.numberOfLines=0;
          desc.lineBreakMode=NSLineBreakByWordWrapping;
          desc.font=[UIFont boldSystemFontOfSize:10];
          desc.textColor=[UIColor whiteColor];
          [cell.contentView addSubview:desc];
     }
     NSString *Str3 = [[Array objectAtIndex:indexPath.row] valueForKey:@"detail"];
     UILabel *desc=(UILabel *)[cell.contentView viewWithTag:2];
     desc.text=Str3;

     cell.selectionStyle=UITableViewCellSelectionStyleNone;
     cell.backgroundColor=[UIColor clearColor];
     cell.contentView.backgroundColor=[UIColor clearColor];
     return cell;
}

我用这个:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
        if (indexPath.row == 2)
    {
        NSString *cellText = @"init some text";
        CGSize labelSize    = [self calculateTextSize:cellText];

        return labelSize.height + 20.0f;
    }

    return 45;
}


- (CGSize) calculateTextSize: (NSString*) text
{
    UIFont *cellFont = [UIFont fontWithName:@"HelveticaNeue" size:12.0];

    CGFloat width = CGRectGetWidth(self.tableView.frame) - 40.0f;
    CGSize constraintSize = CGSizeMake(width, MAXFLOAT);

    CGRect labelRect = [cellText boundingRectWithSize:constraintSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:cellFont} context:NSLineBreakByWordWrapping];

    CGSize labelSize = labelRect.size;

    return labelSize;
}

CGFloat 宽度 = CGRectGetWidth(self.tableView.frame) - 40.0f; - 计算文本的最大可用宽度,可以使用 self.view.frame 等 - 40.0f - 因为我从边缘缩进 = 20.0f

终于想通了。 @RoryMcKinnel 的评论确实有帮助。这是我所做的,以防它可以帮助其他人。问题是我有两种类型的单元格,一种需要调整高度 (additionalText),另一种不需要调整高度。 在原始版本中,我覆盖了 estmatedHeightForRowAtIndexPath 和 heightForRowAtIndexPath 并且在这两种方法中,如果索引是针对附加文本的行,我发送 UITableViewAutomaticDimension 否则我发送帧高度。当然可以进行改进 :) 以发送更好的值,但核心概念是相同的。

这是代码。

    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.additionalTexts[@((long) indexPath.row)] != nil){
        return UITableViewAutomaticDimension;
    } else return [[SongTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MainCellIdentifier].frame.size.height;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.additionalTexts[@((long) indexPath.row)] != nil){
        return UITableViewAutomaticDimension;
    } else return [[SongTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MainCellIdentifier].frame.size.height;
}

结果屏幕看起来像