Ширина пікселя тексту в 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 закреслюється рядком довжиною цілої мітки, але текст може бути коротшим. Чи є спосіб визначити довжину тексту в пікселях, щоб можна було відповідним чином намалювати лінію?

Я також відкритий для будь-яких інших рішень, якщо вони відомі :)

Краще, Ерік

Відповіді:


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 має властивість шрифту, яку ви можете використовувати для динамічного отримання деталей шрифту для вашої мітки, як я це роблю вище.

Сподіваюся, це допомагає :)


5
sizeWithFont застаріла з iOS7. Використовуйте CGSize textSize = [рядок 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?
Матей

Цей варіант значно швидший
Джош Бернфельд,

Нове запитання .. Вам не потрібна ширина / висота для створення мітки? Принаймні я там. Намагаючись знайти ширину тексту, з яким я створюю мітку. let sanskritLabel = UILabel(frame: CGRectMake(0, 120, sanskritStringSize.width, sanskritStringSize.height))
Поїздка

0

Це спрацює. Спробуй це

NSDictionary *attrDict = @{NSFontAttributeName : [GenericUtility getOpenSansRegularFontSize:12]};
CGSize stringBoundingBox = [selectedReservationModel.DateLabel sizeWithAttributes: attrDict];
lblDeliveryDateWidth = stringBoundingBox.width;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.