【问题标题】:How to calculate the height of the text rectangle from an NSString?如何从 NSString 计算文本矩形的高度?
【发布时间】:2011-02-11 11:47:56
【问题描述】:

我知道有这个:

sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:

但由于 CGSize 始终具有相同的高度,并且不会适应任何缩小的文本或其他任何内容,因此 CGSize 无法说明文本的高度。

示例:制作一个 320 x 55 磅的 UILabel 并在其中放置一个 looooooooooooooong 文本。让标签缩小文本。惊喜:CGSize.height 保持相同的高度,即使文本很小以至于需要显微镜。

好吧,在我的头撞到我现在已经坏了一半的 macbook pro 之后,唯一能帮上忙的就是那个讨厌的实际字体大小。但是我认为字体大小是 pica,这并不是你在屏幕上看到的,不是吗?

当字体大小为 10 时,我的文本真的最大高度为 10 磅吗?偶尔我尝试过,一旦文本有 ay 或某些字符延伸到下方(就像 y 的尾部一样),它就超出了范围,整个文本大于 10 点。

那么,在没有长胡子和一些医院经验的情况下,如何计算单行 uilabel 的实际文本高度?

【问题讨论】:

    标签: iphone objective-c cocoa-touch nsstring


    【解决方案1】:

    试试这个代码:

    CGSize maximumSize = CGSizeMake(300, 9999);
    NSString *myString = @"This is a long string which wraps";
    UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14];
    CGSize myStringSize = [myString sizeWithFont:myFont 
        constrainedToSize:maximumSize 
        lineBreakMode:self.myLabel.lineBreakMode];
    

    根据我的回答here

    它使用不同的方法,并在开始时设置了一个非常高的CGSize(然后将其缩小以适合字符串)

    【讨论】:

    • 试过了,还是不行。当文本被标签缩小时,高度保持不变。我还尝试提供标签框的矩形作为最大尺寸。
    • 您是否设置了adjustsFontSizeToFitWidth 以防止字体变小?还是希望尺寸随标签缩小?
    • 是的,我确实希望标签缩小字体大小以适应宽度。如果它被缩小,我需要知道那个缩小文本的高度......
    【解决方案2】:

    重要提示:从 iOS 7.0 开始,不推荐使用以下方法。

    sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:

    改用下面的代码

    CGRect frame = [cellText boundingRectWithSize:CGSizeMake(568,320) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:32.0f]} context:nil];
    float height = frame.size.height;
    

    【讨论】:

      【解决方案3】:

      听起来,在您从该函数调用中获得实际字体大小后,您需要再次使用该新大小进行调用:

      NSString* yourString = @"SomeString";
      float actualSize;
      [yourString sizeWithFont:yourFont 
                   minFontSize:minSize 
                actualFontSize:&actualSize 
                      forWidth:rectWidth 
                 lineBreakMode:breakMode];
      
      CGSize size = [yourString sizeWithFont:[UIFont fontWithName:fontName size:actualSize]];
      

      【讨论】:

      • 这行得通。这不是地球上最有效的事情,但是,在苹果修复他们的错误(不要屏住呼吸)之前,它确实有效。
      【解决方案4】:

      你也设置了label.numberOfLines = 0;

      【讨论】:

      • 不,但这很重要吗?还有,为什么是0?那不是至少 1 行吗?
      • 此属性设置最大可能显示的行数。 1 是默认值。 0 表示标签不会限制行数。
      【解决方案5】:

      运行此代码后,frame.size 将精确地具有您的 nsstring 的高度和宽度..

      NSString *text = @"This is my Mac";
      textFont = [NSFont fontWithName:@"HelveticaNeue-Medium" size: 80.f];
      textColor = [NSColor yellowColor];
      NSDictionary *attribs = @{ NSForegroundColorAttributeName:textColor,
                                 NSFontAttributeName: textFont };
      CGRect frame = [text boundingRectWithSize:CGSizeMake(0,0) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics attributes:attribs context:nil];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-12
        相关资源
        最近更新 更多