如何根据NSString中的文本为UILabel获取适当数量的行?
我需要UITableView中的一个单元格具有基于UILabel高度的动态单元格高度。这意味着我需要从提供的NSString中找出UILabel的高度。
答案 0 :(得分:3)
在给定许多不同的输入参数的情况下,您可以使用UIKit提供的类别方法返回适合字符串的CGSize
。
我唯一需要知道的是指定字体,但您也可以指定其他文字属性。
CGSize size = [text sizeWithAttributes: @{
NSFontAttributeName: [UIFont systemFontOfSize:14.0f]
}];
鉴于此,你可以计算出有多少行文字。
修改强>
您可能希望查看boundingRectWithSize:options:attributes:
。您将传递标签string drawing options的大小和文字属性(如字体)。
答案 1 :(得分:1)
我现在所做的是使用autolayout。标签通过对细胞周围内容视图的所有侧面的约束进行挂钩。我手边有一个细胞实例。当计算单元格高度的时候,我在标签上填写该行的文本并执行自动布局。标签自动调整大小以包含文本;单元格自动调整大小以适合标签;现在我学习了单元格大小:
- (CGFloat) cellHeightForLabelString:(NSString*)s {
Cell* cell = self.practiceCell;
UILabel* lab = cell.lab;
lab.text = s; // no need to know font, constraints, or anything else about label
CGFloat h = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingExpandedSize].height;
return ceil(h) + 1;
// The "+1" is needed because the separator subtracts from the cell internal height!
}
第一次请求时,每个单元格的高度都被记忆到一个数组中,因此如果再次请求它,我可以在数组中查找它:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger ix = indexPath.row;
if ([NSNull null] == self.heights[ix]) {
NSString* s = self.trivia[ix];
CGFloat h = [self cellHeightForLabelString:s];
self.heights[ix] = @(h);
}
return [self.heights[ix] floatValue];
}
答案 2 :(得分:0)
好吧,在我查阅之前,我建议使用 sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 来自UIKIt的新增NSString。 https://developer.apple.com/library/ios/documentation/uikit/reference/NSString_UIKit_Additions/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instm/NSString/sizeWithFont:forWidth:lineBreakMode:
然而,该文档说它自iOS 7以来已被弃用。因此使用它可能不再适用。也许其他人有一个更好的想法,不是基于已弃用的功能。
答案 3 :(得分:-1)
以下是我的工作。
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// create UILabel and set text (as per font and size)
// call [myLabel sizeToFit];
// now find the height of the UILabel
// use this height as the height of the cell
// hide this UILabel, release this UILabel
// done
}
这样,我确保我得到的高度是完美的!!!