计算动态UILabel的行数(iOS7)

Posted

技术标签:

【中文标题】计算动态UILabel的行数(iOS7)【英文标题】:Calculating number of lines of dynamic UILabel (iOS7) 【发布时间】:2013-09-13 10:33:22 【问题描述】:

围绕这个问题有很多解决方案,但找不到未弃用的解决方案。

我有一个UILabel,模式为 WordWrap,固定宽度为 250,行数设置为 0。

这是我尝试过的:

UILabel *contentLabel = (UILabel*)[contentView viewWithTag:10];
CGSize size = [contentLabel.text sizeWithFont:contentLabel.font forWidth:contentLabel.frame.size.width lineBreakMode:NSLineBreakByWordWrapping];
NSLog(@"Label's height is: %d", size.height);

height 参数的输出总是 20(所以它就像一行),而 te 文本是 30 行长。

出于 UIScrollView 的目的,我需要它。

【问题讨论】:

如果以上答案是肯定的,那么请试试这个 [contentLabel sizeToFit];希望这能解决您的问题。 没有提到使用UITableView。 对不起..谢谢你让我注意到..你试过这个 [contentLabel sizeToFit]; 因为在你的代码中你写了 forWidth ,它应该是 constrainedToSize Cmd + 点击 sizeWithFont:forWidth:lineBreakMode: 您会看到建议使用的新方法,而不是已弃用的方法。您还可以使用预发布文档来了解详细信息。 【参考方案1】:

使用文档中建议的方法:

- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context NS_AVAILABLE_ios(7_0);

例如

    CGSize maxSize = CGSizeMake(self.label.frame.size.width, MAXFLOAT);

    CGRect labelRect = [self.label.text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@NSFontAttributeName:self.label.font context:nil];

    NSLog(@"size %@", NSStringFromCGSize(labelRect.size));

【讨论】:

不要忘记设置宽度和高度; ceil(labelRect.size.width); 但是这个只返回一行的高度。它如何适用于多行? @bagusflyer 查看我如何解决单行高结果的答案 如何从中找到行数?? 这是有效的,但是为了计算多行的高度,添加:[label sizeToFit];【参考方案2】:

我在 UILabel 的属性文本上直接使用 boundingRectWithSize 时遇到了问题——它没有考虑了多行的换行(返回的高度始终为 17.5)。为了解决这个问题,我不得不在 UILabel 的 text 属性上使用 boundingRectWithSize 并分别传入属性字典(not 通过[self.myLabel.attributedText attributesAtIndex:0 effectiveRange:nil])。

CGRect labelSize = CGRectIntegral([self.myLabel.text     
    boundingRectWithSize:CGSizeMake(self.myLabel.frame.size.width, MAXFLOAT) 
    options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading
    attributes:@NSFontAttributeName:self.myLabel.font, 
    NSParagraphStyleAttributeName:paragraphStyle context:nil]);

【讨论】:

如果我正在使用自动布局并且 self.myLabel.frame 尚未计算怎么办? 我相信这篇文章与这个问题有关,尽管它没有回答它 @VladimírSlavík 您应该仅在已知帧时调用此代码;恐怕不能以任何其他方式做到这一点。在适当的时候调用这个功能,比如 viewDidLoad 等 这太愚蠢了。几个小时以来,我一直在为这个确切的问题烦恼。为什么现有的属性不起作用?【参考方案3】:

你可以使用这个简单的方法:

返回行数

- (int)lineCountForLabel:(UILabel *)label

    CGFloat labelWidth = label.frame.size.width;
    int lineCount = 0;
    CGSize textSize = CGSizeMake(labelWidth, MAXFLOAT);
    long rHeight = lroundf([label sizeThatFits:textSize].height);
    long charSize = lroundf(label.font.leading);
    lineCount = (int)( rHeight / charSize );
    return lineCount;

通过调用

[self lineCountForLabel:YOUR_LABEL];

【讨论】:

【参考方案4】:
     let l = UILabel()

        l.numberOfLines = 0


        l.layer.frame.size.width = self.view.frame.width - 40 /*(Padding 20 + 20)*/
        l.font = UIFont(name: "BwModelica-Bold", size: 16.0)

        l.text = "Your Any length Text!!"

        let noOfLines = ceil(l.intrinsicContentSize.width) / l.frame.width

        let lbl_height = noOfLines * l.intrinsicContentSize.height

这将是您的标签的确切动态高度。编码愉快!!!

【讨论】:

【参考方案5】:

这对我有用:

*设置UILabel的numberOfLines属性为0 *在将文本分配给 UILabel 之后添加这一行:yourLabel.sizeToFit()

【讨论】:

【参考方案6】:

试试这个

//Here tweetText is an object of NSString and assign a text to it  
NSString *tweetText = tweet.tweetText;
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

CGSize size = [tweetText sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping];

//detailLabel is an object of UILabel    
[detailLabel setText:tweetText];

//Set frame
[detailLabel setFrame:CGRectMake(76,20,280, MAX(size.height, 30.0f))];

【讨论】:

sizeWithFont 已弃用。 OP 想要不被弃用的解决方案。 在 iOS 7 中,您可以使用 boundingRectWithSize: 代替 sizeWithFont:.【参考方案7】:

这是我正在使用的方法:

CGSize maximumSize = CGSizeMake(contentLabel.frame.size.width, 9999);

CGSize myStringSize = [eventName sizeWithFont:contentLabel.font
                            constrainedToSize:maximumSize
                                lineBreakMode:UILineBreakModeWordWrap];

【讨论】:

UILineBreakModeWordWrap 已弃用,使用 NSLineBreakByWordWrapping 在 iOS 7 中,sizeWithFont:... 也已被弃用。请改用boundingRectWithSize:...

以上是关于计算动态UILabel的行数(iOS7)的主要内容,如果未能解决你的问题,请参考以下文章

如何找到 UILabel 的行数

在 Swift 中向 UILabel 动态添加行

动画改变 UILabel 的行数

没有为 UILabel 获得正确的行数

当 UITableViewCell 中的行数固定时,UILabel 占用空间?

根据包含的文本设置 UILabel 的行数 - Objective C 和/或 Swift