UILabel中文本的像素宽度

Eri*_*rik 77 iphone objective-c uilabel

我需要绘制一个UILabel.因此,我将UILabel子类化并实现如下:

@implementation UIStrikedLabel

- (void)drawTextInRect:(CGRect)rect{
    [super drawTextInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextFillRect(context,CGRectMake(0,rect.size.height/2,rect.size.width,1));
}
@end
Run Code Online (Sandbox Code Playgroud)

会发生的事情是,UILabel的线条与整个标签一样长,但文本可以更短.有没有办法确定文本的长度(以像素为单位),以便可以适当地绘制线条?

我也对任何其他解决方案持开放态度,如果已知:)

最好的,Erik

小智 194

NSString有一个sizeWithAttributes:方法,可以用于此目的.它返回一个CGSize结构,因此您可以执行与以下内容类似的操作来查找标签内文本的宽度.

iOS 7及更高版本

CGSize textSize = [[label text] sizeWithAttributes:@{NSFontAttributeName:[label font]}];

CGFloat strikeWidth = textSize.width;
Run Code Online (Sandbox Code Playgroud)

iOS <7

在iOS7之前,您必须使用sizeWithFont:方法.

CGSize textSize = [[label text] sizeWithFont:[label font]];

CGFloat strikeWidth = textSize.width;
Run Code Online (Sandbox Code Playgroud)

UILabel有一个字体属性,您可以使用它来动态获取标签的字体详细信息,就像我上面所做的那样.

希望这可以帮助 :)

  • 自iOS7以来,不推荐使用sizeWithFont.使用CGSize textSize = [string sizeWithAttributes:@ {NSFontAttributeName:[UIFont systemFontOfSize:14.0f]}]; 代替. (5认同)

Aks*_*Aks 66

一个更好的解决方案,在Swift中:
更新:
用于Swift 3/4:

@IBOutlet weak var testLabel: UILabel!
// in any function
testLabel.text = "New Label Text"
let width = testLabel.intrinsicContentSize.width
let height = testLabel.intrinsicContentSize.height
print("width:\(width), height: \(height)")
Run Code Online (Sandbox Code Playgroud)

旧答案:

yourLabel?.text = "Test label text" // sample label text
let labelTextWidth = yourLabel?.intrinsicContentSize().width
let labelTextHeight = yourLabel?.intrinsicContentSize().height
Run Code Online (Sandbox Code Playgroud)