iOS - 动态调整tableviewcell大小的问题

时间:2014-02-10 08:06:08

标签: ios uitableview heightforrowatindexpath dynamic-resizing

我知道这个问题已经有很多可能的答案,但到目前为止,我已经看过使用sizeWithFont的所有答案的99.995%,现已弃用。

我有一个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然后我可以看到一切。 (奇怪的)。

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

1 个答案:

答案 0 :(得分:2)

NSString的{​​{1}}确实已在iOS 7中弃用,但被sizeWithFont:取代。对于多行文字,sizeWithAttributes:很有用。见

iOS 7 sizeWithAttributes: replacement for sizeWithFont:constrainedToSize

用于boundingRectWithSize:options:attributes:context:方法的相关替代。

问题#1:我不确定你想要的效果究竟是什么。如果您希望在UILabel之上和之下使用常量填充,但最小单元格高度为44磅,则可能需要执行以下操作:

UILabel

但是,如果您希望以某种方式将单元格高度基于文本行数,则将计算出的高度除以-(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); } 的{​​{1}}属性并进行舍入将起作用:< / p>

UIFont

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

我认为NSUInteger numberOfLines = roundf(calculatedTextHeight / font.lineHeight); 方法是最好的方法,但另外,如果你想使用numberOfLines方法,我建议只创建一次标签帮助NSString滚动表演,例如

UILabel