如何找到UILabel的行数

Vel*_*gan 41 iphone

我使用wrap方法在UILabel中显示了文本.现在我想要找到UILabel中有多少行.

如果有任何可能的方法可以找到UILabel的行数.

谢谢.

Kal*_*lle 50

正如所指出的,这篇文章涉及如何获得高度,而不是线的数量.要获得行数,

  1. 获得单个字母的高度,例如@"A".
  2. 将字符串的高度除以上面1中获得的高度.

例如

CGFloat unitHeight = [@"A" heightForWidth:width usingFont:font];
CGFloat blockHeight = [text heightForWidth:width usingFont:font];
NSInteger numberOfLines =        ceilf(blockHeight / unitHeight); 
// need to #include <math.h> for ^^^^^
Run Code Online (Sandbox Code Playgroud)

从iOS 7开始,获得标签所需高度的方式发生了变化.要获得高度,您可以使用以下代码:

NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
CGSize labelSize = (CGSize){width, FLT_MAX};
CGRect r = [self boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:context];
Run Code Online (Sandbox Code Playgroud)

高度在哪里r.size.height.请注意,font必须提供.为方便起见,您可以将其放入NSString的类别中,例如

@implementation NSString (HeightCalc)

- (CGFloat)heightForWidth:(CGFloat)width usingFont:(UIFont *)font
{
    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGSize labelSize = (CGSize){width, FLT_MAX};
    CGRect r = [self boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: font} context:context];
    return r.size.height;
}

@end
Run Code Online (Sandbox Code Playgroud)

(如果不使用ARC,请进行内存管理,顺便说一下.)

适用于iOS 6及以下版本:

假设您有一个UILabel *myLabel并且您想要找出标签的高度(通过一些调整,您可以通过将高度除以一些适当的数字来获得行数,这取决于字体大小).

UILabel *myLabel;
CGSize labelSize = [myLabel.text sizeWithFont:myLabel.font 
                            constrainedToSize:myLabel.frame.size 
                                lineBreakMode:UILineBreakModeWordWrap];
CGFloat labelHeight = labelSize.height;
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.如果它不起作用,请告诉我,我会进一步挖掘.此外,未经测试的代码,但参考工作.

有关更完整的示例,这里是我放在视图控制器的viewDidLoad:方法中的代码:

[super viewDidLoad];
UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(50,50,200,350)];
myLabel.numberOfLines = 0;
myLabel.lineBreakMode = UILineBreakModeWordWrap;
myLabel.text = @"This is some text in a UILabel which is long enough to wrap around the lines in said UILabel. This is a test, this is only a test.";
[self.view addSubview:myLabel];
CGSize labelSize = [myLabel.text sizeWithFont:myLabel.font 
                            constrainedToSize:myLabel.frame.size 
                                lineBreakMode:UILineBreakModeWordWrap];
CGFloat labelHeight = labelSize.height;
NSLog(@"labelHeight = %f", labelHeight);
[myLabel release];
Run Code Online (Sandbox Code Playgroud)

NSLog的输出如下:

2010-11-15 18:25:27.817 so_labelheight[728:307] labelHeight = 126.000000
Run Code Online (Sandbox Code Playgroud)


joh*_*les 14

对于iOS7及更高版本,官方认可的计算行数的方法是使用TextKit:

func numberOfLinesForString(string: String, size: CGSize, font: UIFont) -> Int {
    let textStorage = NSTextStorage(string: string, attributes: [NSFontAttributeName: font])

    let textContainer = NSTextContainer(size: size)
    textContainer.lineBreakMode = .ByWordWrapping
    textContainer.maximumNumberOfLines = 0
    textContainer.lineFragmentPadding = 0

    let layoutManager = NSLayoutManager()
    layoutManager.textStorage = textStorage
    layoutManager.addTextContainer(textContainer)

    var numberOfLines = 0
    var index = 0
    var lineRange : NSRange = NSMakeRange(0, 0)
    for (; index < layoutManager.numberOfGlyphs; numberOfLines++) {
        layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange)
        index = NSMaxRange(lineRange)
    }

    return numberOfLines
}
Run Code Online (Sandbox Code Playgroud)


Ada*_*o13 7

该方法-sizeWithFont:constrainedToSize:lineBreakMode现已弃用.您-boundingRectWithSize:options:attributes:context:现在想要使用该方法.

这是一个例子:

CGSize boundingRectSize = CGSizeMake(widthToConstrainTo, CGFLOAT_MAX);
NSDictionary *attributes = @{NSFontAttributeName : [UIFont fontWithName:fontName size:14]};
CGRect labelSize = [labelString boundingRectWithSize:boundingRectSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                                attributes:attributes
                                                   context:nil];
Run Code Online (Sandbox Code Playgroud)

在上面的例子中我知道我想要约束标签的宽度,但由于我不确定高度,我只是使用最大高度参数CGFLOAT_MAX.对于options您需要使用的NSStringDrawingUsesLineFragmentOrigin,NSStringDrawingUsesFontLeading如果您正在尝试计算大小可以是任意数量的行的标签.


cph*_*117 7

如果你在Swift 2 +/iOS 8中寻找这个答案,它看起来像这样:

func numberOfLinesInLabel(yourString: String, labelWidth: CGFloat, labelHeight: CGFloat, font: UIFont) -> Int {

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.minimumLineHeight = labelHeight
    paragraphStyle.maximumLineHeight = labelHeight
    paragraphStyle.lineBreakMode = .ByWordWrapping

    let attributes: [String: AnyObject] = [NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle]

    let constrain = CGSizeMake(labelWidth, CGFloat(Float.infinity))

    let size = yourString.sizeWithAttributes(attributes)
    let stringWidth = size.width

    let numberOfLines = ceil(Double(stringWidth/constrain.width))

    return Int(numberOfLines)
}
Run Code Online (Sandbox Code Playgroud)


gue*_*nis 6

sizeWithFont 在iOS 7中已弃用,您可以使用此代码:

- (int)lineCountForText:(NSString *) text
{
    UIFont *font = ...

    CGRect rect = [text boundingRectWithSize:CGSizeMake(200, MAXFLOAT)
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:@{NSFontAttributeName : font}
                                     context:nil];

    return ceil(rect.size.height / font.lineHeight);
}
Run Code Online (Sandbox Code Playgroud)