我知道这个问题已经有很多可能的答案,但到目前为止,我已经看过使用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然后我可以看到一切。 (奇怪的)。
寻找一些优雅的解决方案,反馈,帮助等等。谢谢!
答案 0 :(得分:2)
NSString
的{{1}}确实已在iOS 7中弃用,但被sizeWithFont:
取代。对于多行文字,sizeWithAttributes:
很有用。见
iOS 7 sizeWithAttributes: replacement for sizeWithFont:constrainedToSize
用于boundingRectWithSize:options:attributes:context:
方法的相关替代。
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