Ширина пикселя текста в 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

Что происходит, так это то, что UILabel заштриховывается с линией, имеющей длину всего ярлыка, но текст может быть короче. Есть ли способ определить длину текста в пикселях, чтобы линия могла быть нарисована соответствующим образом?

Я также открыт для любых других решений, если они известны:)

Бест, Erik

Ответ 1

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, которое вы можете использовать для динамического получения сведений о шрифтах для вашего ярлыка, как я делаю выше.

Надеюсь, что это поможет:)

Ответ 2

Лучшее решение, здесь, в Swift:
Update:
Для 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

Ответ 3

надеюсь, что этот пример поможет вам (iOS > 7)

NSString *text = @"    // Do any additional setup after loading the view, typically from a nib.";
CGRect rect = CGRectZero;
NSDictionary *attrDict = @{NSFontAttributeName : [UIFont systemFontOfSize:17]};

rect = [text boundingRectWithSize:CGSizeMake(100,9999)
                          options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                       attributes:attrDict
                          context:Nil];

UILabel *lbl = [[UILabel alloc] init];
lbl.text = text;
rect.origin = CGPointMake(50, 200);
lbl.frame = rect;
lbl.lineBreakMode = NSLineBreakByWordWrapping;
lbl.numberOfLines = 0;
[self.view addSubview:lbl];