如何获得UILabel(UITextView)自动调整字体大小?

时间:2010-09-08 16:25:38

标签: iphone

自动调整后是否可以获得最终字体大小? (属性adjustsFontSizeToFitWidth设置为YES,文本字体大小正在缩小以适合标签)

我在UILabel中将drawTextInRect子类化为在文本上放置渐变,但渐变大小需要与字体的大小相同。我无法获得调整后字体的大小......是否可能?

  //draw gradient

    CGContextSaveGState(myContext);
        CGGradientRef glossGradient;
        CGColorSpaceRef rgbColorspace;
        size_t num_locations = 2;
        CGFloat locations[2] = { 0.0, 1.0 };
        CGFloat components[8] = { 1, 1, 1, 0.25,  // BOTTOM color
            1, 1, 1, 0.12 }; // UPPER color

    //scale and translate so that text would not be rotated 180 deg wrong
        CGContextTranslateCTM(myContext, 0, rect.size.height);
        CGContextScaleCTM(myContext, 1.0, -1.0);

//create mask
        CGImageRef alphaMask = CGBitmapContextCreateImage(myContext);
        CGContextClipToMask(myContext, rect, alphaMask);

        rgbColorspace = CGColorSpaceCreateDeviceRGB();
        glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);

    //gradient should be sized to actual font size. THIS IS THE PROBLEM - EVEN IF FONT IS AUTO ADUJSTED, I AM GETTING THE SAME ORIGINAL FONT SIZE!!!

        CGFloat fontCapHeightHalf = (self.font.capHeight/2)+5;
            CGRect currentBounds = rect;
        CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)-fontCapHeightHalf);
        CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds)+fontCapHeightHalf);

        CGContextDrawLinearGradient(myContext, glossGradient, topCenter, midCenter, 0);

        CGGradientRelease(glossGradient);
        CGColorSpaceRelease(rgbColorspace);
    CGContextRestoreGState(myContext);

4 个答案:

答案 0 :(得分:17)

您无法直接获取尺寸,但可以使用these functions

轻松计算尺寸
CGFloat actualFontSize;
[label.text sizeWithFont:label.font
             minFontSize:label.minimumFontSize
          actualFontSize:&actualFontSize
                forWidth:label.bounds.size.width
           lineBreakMode:label.lineBreakMode];

答案 1 :(得分:2)

CGSize  size = [label.text sizeWithFont:label.font minFontSize:10 actualFontSize:&actualFontSize forWidth:200 lineBreakMode:UILineBreakModeTailTruncation];

答案 2 :(得分:2)

我的回答对原始问题没什么帮助,但每次我在自动调整后搜索如何获取字体大小时,我都会在这里结束。 首先,我们都知道,在iOS 7.0中已经弃用sizeWithFont,因此我们必须找到另一种解决方案。

我的解决方案符合我的情况,我有两个标签,一个有更多约束,文字多于第二个。

以下是一个分步示例:

  • 两个具有相同宽度和不同文字长度的标签:

enter image description here

我想在运行时调整主要uilabel的字体大小,第二个字体大小要相同。

  • 减小两个标签的大小,使第一个文本适合框架,在这种情况下为12:

enter image description here

enter image description here

  • 设置了位置约束后(在我的示例中,标签保留在父视图的中心),更新两个标签'框架使它们完全符合文本:

enter image description here

  • 将宽度和高度之间的Aspect Ratio约束添加到两个标签以及主标签和父视图之间的宽度约束:

enter image description here

enter image description here

  • 将宽度约束从第二个标签添加到主标签:

enter image description here

enter image description here

  • 现在您可以根据需要设置标签的字体大小:

enter image description here

以下是模拟器的屏幕截图:

enter image description here

根据屏幕尺寸调整第一个标签的大小,因此调整字体大小。由于宽度约束和最后一张图像中指定的字体参数,第二个标签的字体大小相同。

这只是一个旨在展示"技巧的例子。在我的解决方案背后:以初始字体大小绑定标签的框架,以便在运行时它们是相同的。我想这个技术可以重新适应标签,大小可变,只需在设置文本后调整标签之间的约束并调整框架大小以适应文本。

答案 3 :(得分:0)

这个简单的解决方案适用于单行UILabel:

//myLabel - initial label

UILabel *fullSizeLabel = [UILabel new];
fullSizeLabel.font = myLabel.font;
fullSizeLabel.text = myLabel.text;
[fullSizeLabel sizeToFit];

CGFloat actualFontSize = myLabel.font.pointSize * (myLabel.bounds.size.width / fullSizeLabel.bounds.size.width);

//correct, if new font size bigger than initial
actualFontSize = actualFontSize < myLabel.font.pointSize ? actualFontSize : myLabel.font.pointSize;