0

我知道这里已经有很多关于这个问题的潜在答案,但到目前为止,我看到的所有答案中有 99.995% 使用 sizeWithFont,现在已弃用。

我在这里处理一个 tableviewcell,所以它应该很简单,但事情对我来说并不奏效。这是通过在线阅读一些答案而整理的代码。这是一个单元格标签。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  NSString *myString = [self.locations[indexPath.row] locationDescription];
  return [self heightForText:myString] + 44.0;
}

-(CGFloat)heightForText:(NSString *)text{

  NSInteger MAX_HEIGHT = 10000;
  UILabel *cellLabelView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, MAX_HEIGHT)];
  cellLabelView.text = text;
  cellLabelView.font = [UIFont fontWithName:@"Helvetica Neue Light" size:18];
  [cellLabelView sizeToFit];
  return cellLabelView.frame.size.height;
}

故事板中定义的高度设置为 44,标签本身的行设置为 0,以便标签可以决定它需要多大。

问题#1:如果设置为标签的文本没有自动换行,我仍然(显然)得到额外的填充,这不是我想要的。我不确定如何计算是否真的有自动换行。如果没有自动换行(即文本不长于标签,那么我只想返回 44)。

问题 #2:由于某种原因,如果我的文本太长,例如价值 5 行,则字符串末尾的一些文本由于某种原因被截断,尽管 MAXHEIGHT 为 10,000,但它几乎就像它决定停止自动换行。如果此时我增加填充,比如说 88,那么我可以看到所有内容。(诡异的)。

寻找一些优雅的解决方案、反馈、帮助等等。谢谢!

4

1 回答 1

2

NSString'ssizeWithFont:在 iOS 7 中确实已被弃用,但被sizeWithAttributes:. 对于多行文本,boundingRectWithSize:options:attributes:context:很有用。看

iOS 7 sizeWithAttributes:替换 sizeWithFont:constrainedToSize

寻找您UILabel方法的相关替代方案。

问题#1:我不确定你想要的效果到底是什么。如果您希望在您的 上方和下方有一个恒定的填充UILabel,但最小单元格高度为 44 点,您可能想要执行以下操作:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  NSString *myString = [self.locations[indexPath.row] locationDescription];
  CGFloat myPadding = 20.0; // for example
  return MAX([self heightForText:myString] + myPadding, 44.0);
}

但是,如果您想以某种方式将单元格高度基于文本行数,那么将计算出的高度除以UIFont'lineHeight属性和舍入将起作用:

NSUInteger numberOfLines = roundf(calculatedTextHeight / font.lineHeight);

问题 #2:您为计算高度而创建的标签尚未numberOfLines设置为 0,因此不会为多行标签调整自身大小。

我认为该NSString方法是最好的方法,但顺便说一句,如果您想使用该UILabel方法,我建议只创建一次标签以帮助UITableView滚动性能,例如

-(CGFloat)heightForText:(NSString *)text{
  NSInteger MAX_HEIGHT = 10000;
  static UILabel *cellLabelView = nil;
  if (!cellLabelView)
  {
     cellLabelView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, MAX_HEIGHT)];
     cellLabelView.text = text;
     cellLabelView.font = [UIFont fontWithName:@"Helvetica Neue Light" size:18]; 
     cellLabelView.numberOfLines = 0;     
  } 
  return [cellLabelView sizeThatFits:CGSizeMake(320, MAX_HEIGHT)].height;
}
于 2014-02-10T23:17:25.603 回答