8

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

我有一个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 text 的输出就像 30 行一样长。

我需要它用于 UIScrollView 的目的。

4

7 回答 7

55

在文档方法中建议使用:

- (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));
于 2013-09-13T11:31:54.480 回答
4

我在 UILabel 的属性文本上直接使用 boundingRectWithSize 时遇到了问题——它没有考虑到多行的换行(返回的高度始终为 17.5)。为了解决这个问题,我不得不在 UILabel 的text属性上使用 boundingRectWithSize 并单独(而不是via [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]);
于 2015-01-29T22:44:45.700 回答
1

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

这将返回行数

- (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];
于 2015-07-20T10:49:38.320 回答
0
     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

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

于 2019-01-18T07:46:12.623 回答
0

这对我有用:

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

于 2021-05-29T17:12:45.690 回答
-3

试试这个

//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))];
于 2013-09-13T11:01:13.780 回答
-6

这是我正在使用的方法:

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

CGSize myStringSize = [eventName sizeWithFont:contentLabel.font
                            constrainedToSize:maximumSize
                                lineBreakMode:UILineBreakModeWordWrap];
于 2013-09-13T10:51:40.007 回答