79

我需要画一个划过的 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 被划线,一行与整个标签一样长,但文本可以更短。有没有办法以像素为单位确定文本的长度,以便可以适当地绘制线条?

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

最好的,埃里克

4

3 回答 3

196

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 有一个字体属性,您可以使用它来动态获取标签的字体详细信息,就像我在上面所做的那样。

希望这可以帮助 :)

于 2009-08-27T12:37:09.543 回答
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
于 2014-12-29T06:30:53.563 回答
0

这将起作用。尝试一下

NSDictionary *attrDict = @{NSFontAttributeName : [GenericUtility getOpenSansRegularFontSize:12]};
CGSize stringBoundingBox = [selectedReservationModel.DateLabel sizeWithAttributes: attrDict];
lblDeliveryDateWidth = stringBoundingBox.width;
于 2020-09-18T06:36:35.723 回答