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