从NSString获取UILabel所需的行数?

时间:2014-04-12 20:21:19

标签: ios objective-c uitableview nsstring uilabel

如何根据NSString中的文本为UILabel获取适当数量的行?

我需要UITableView中的一个单元格具有基于UILabel高度的动态单元格高度。这意味着我需要从提供的NSString中找出UILabel的高度。

4 个答案:

答案 0 :(得分:3)

在给定许多不同的输入参数的情况下,您可以使用UIKit提供的类别方法返回适合字符串的CGSize

我唯一需要知道的是指定字体,但您也可以指定其他文字属性。

CGSize size = [text sizeWithAttributes: @{
                  NSFontAttributeName: [UIFont systemFontOfSize:14.0f]
              }];

鉴于此,你可以计算出有多少行文字。

请参阅此处的文档: https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSString_AppKitAdditions/Reference/Reference.html#//apple_ref/occ/instm/NSString/sizeWithAttributes

修改

您可能希望查看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

}

这样,我确保我得到的高度是完美的!!!