Текст подчеркивания в UIlabel

Как я могу подчеркнуть текст, который мог быть несколькими строками строки? Я нахожу, что некоторые люди предлагают UIWebView, но это - очевидно, слишком тяжелый класс для просто текстового рендеринга.

Мои мысли состояли в том, чтобы выяснить стартовую точку и длину каждой строки в каждой строке. И чертите линию под ним соответственно.

Я встречаю проблемы в том, как выяснить длину и стартовую точку для строки.

Я пытался использовать -[UILabel textRectForBounds:limitedToNumberOfLines:], это должно быть ограничением рисунка, реагируют для текстового права? Затем я должен работать над выравниванием? Как я могу получить стартовую точку каждой строки, когда она выравнивается по ширине центром и выровнена по правому краю?

82
задан Cœur 27 May 2019 в 23:59
поделиться

2 ответа

Вы можете создать подкласс от UILabel и переопределить метод drawRect:

- (void)drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(ctx, 207.0f/255.0f, 91.0f/255.0f, 44.0f/255.0f, 1.0f); // RGBA
    CGContextSetLineWidth(ctx, 1.0f);

    CGContextMoveToPoint(ctx, 0, self.bounds.size.height - 1);
    CGContextAddLineToPoint(ctx, self.bounds.size.width, self.bounds.size.height - 1);

    CGContextStrokePath(ctx);

    [super drawRect:rect];  
}

UPD:
В iOS 6 Apple добавила поддержку NSAttributedString для UILabel, так что теперь это намного проще и работает для нескольких строк:

NSDictionary *underlineAttribute = @{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:@"Test string" 
                                                         attributes:underlineAttribute];

Если вы все еще хотите для поддержки iOS 4 и iOS 5 я бы рекомендовал использовать TTTAttributedLabel , а не подчеркивать метку вручную. Однако, если вам нужно подчеркнуть однострочный UILabel и вы не хотите использовать сторонние компоненты, приведенный выше код все равно поможет.

135
ответ дан 24 November 2019 в 09:01
поделиться

Как показал Ковпас, вы можете использовать ограничивающую рамку в большинстве случаев, хотя это не всегда гарантируется, что ограничивающая рамка аккуратно впишется в текст. Поле с высотой 50 и размером шрифта 12 может не дать желаемых результатов в зависимости от конфигурации UILabel.

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

Вам также следует обратить внимание на свойство UIFont «интерлиньяж», которое определяет расстояние между базовыми линиями на основе определенного шрифта. Базовая линия - это то место, где вы хотите нарисовать подчеркивание.

Найдите дополнения UIKit к NSString:

(CGSize)sizeWithFont:(UIFont *)font 
//Returns the size of the string if it were to be rendered with the specified font on a single line.

(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size 
// Returns the size of the string if it were rendered and constrained to the specified size.

(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode
//Returns the size of the string if it were rendered with the specified constraints.
0
ответ дан 24 November 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: