Пиксельная ширина текста в UILabel - PullRequest
76 голосов
/ 27 августа 2009

Мне нужно нарисовать 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

Ответы [ 3 ]

194 голосов
/ 27 августа 2009

NSString имеет метод sizeWithAttributes: , который можно использовать для этого. Он возвращает структуру CGSize, так что вы можете сделать что-то похожее на следующее, чтобы найти ширину текста внутри вашего ярлыка.

iOS 7 и выше

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

CGFloat strikeWidth = textSize.width;

iOS <7 </h2> До iOS7 вам приходилось использовать метод sizeWithFont: . CGSize textSize = [[label text] sizeWithFont:[label font]]; CGFloat strikeWidth = textSize.width; UILabel имеет свойство шрифта, которое можно использовать для динамического получения сведений о шрифте для вашего ярлыка, как я делаю выше. Надеюсь, это поможет:)

64 голосов
/ 29 декабря 2014

Лучшее решение, здесь, в 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
1 голос
/ 10 ноября 2014

надеюсь, что этот образец поможет вам (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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...