UILabel中文本的像素宽度


78

我需要绘制一个删除的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

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

我也愿意接受其他解决方案,如果知道的话:)

最好,埃里克

Answers:


195

NSString具有sizeWithAttributes:方法可用于此目的。它会返回CGSize结构,因此您可以执行以下操作来查找标签内文本的宽度。

iOS 7及更高版本

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

CGFloat strikeWidth = textSize.width;

iOS <7

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

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

CGFloat strikeWidth = textSize.width;

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

希望这可以帮助 :)


5
自iOS7起不推荐使用sizeWithFont。使用CGSize textSize = [string sizeWithAttributes:@ {NSFontAttributeName:[UIFont systemFontOfSize:14.0f]}]];代替。
cldrr

您也可以使用label.attributedText.size
杰德·福克斯

70

更好的解决方案,在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)")

旧答案:

yourLabel?.text = "Test label text" // sample label text
let labelTextWidth = yourLabel?.intrinsicContentSize().width
let labelTextHeight = yourLabel?.intrinsicContentSize().height

这是ios 7兼容吗?
Matej 2015年

这个选项的速度明显更快
Josh Bernfeld

Newb问题..虽然您不需要宽度/高度来创建标签吗?至少那是我的所在。试图找到我用来创建标签的文本的宽度。 let sanskritLabel = UILabel(frame: CGRectMake(0, 120, sanskritStringSize.width, sanskritStringSize.height))
2016年

0

这会起作用。尝试一下

NSDictionary *attrDict = @{NSFontAttributeName : [GenericUtility getOpenSansRegularFontSize:12]};
CGSize stringBoundingBox = [selectedReservationModel.DateLabel sizeWithAttributes: attrDict];
lblDeliveryDateWidth = stringBoundingBox.width;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.