Подчеркивание сбоя

Я пытаюсь добавить подчеркивание к атрибутированному тексту, используя собственный шрифт (HelveticaRounded-Bold). Тем не менее, подчеркивание глючит как на Симуляторе, так и на устройстве. Как это:

введите здесь описание изображения

Это UILabel, но я также могу воспроизвести проблему в UITextView. Создается впечатление, что визуализатор текста неправильно вычисляет, где на некоторых строках рисовать подчеркивание.

Голый код:

- (void)viewDidLoad {
  [super viewDidLoad];
  UIFont *font = [UIFont fontWithName:@"HelveticaRounded-Bold" size:18];
  self.label.font = font;
  self.label.numberOfLines = 0;
  NSDictionary *attributes = @{ NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle) };
  self.label.attributedText = [[NSAttributedString alloc] initWithString:@"This is a test. And the test has failed. What did I do to deserve this? Why NSUnderlineStyleAttributeName? Why?"
                                                              attributes:attributes];
}

Забавный факт: подчеркивание не глючит при размере 24 и выше (!). Он также не воспроизводится с использованием TTTAttributedLabel.

Есть идеи, что здесь может происходить?


person hpique    schedule 16.03.2015    source источник
comment
Я тоже вижу эту проблему. Вы нашли решение для этого?   -  person lagouyn    schedule 20.05.2015
comment
Я попробовал шрифт, который, как я знаю, является проблематичным в этом отношении, в Apple TextEdit, и проблема возникает и там. Плохой шрифт, интересно?   -  person lagouyn    schedule 21.05.2015


Ответы (2)


Это похоже на сбой на устройствах без сетчатки при использовании NSUnderlineStyleThick. Переключение на NSUnderlineStyleSingle похоже решает проблему. Таким образом, вы можете установить условие для устройств без сетчатки, чтобы использовать NSUnderlineStyleSingle, если вы хотите сохранить NSUnderlineStyleThick на других устройствах.

Изменить: только что понял, что вы используете NSUnderlineStyleSingle в своем примере кода:/ В моем коде это работало для моего заданного шрифта/размера, который является просто системным шрифтом. Это решило проблему с моей стороны. Так что кажется, что это исправление может быть не универсальным, но в моем случае оно сработало.

person Four    schedule 12.07.2016

У меня была такая же проблема для UIButton на дисплее без сетчатки. Что я сделал, так это просто изменил «NSUnderlineStyleSingle» на «NSUnderlineStyleDouble» для устройств без сетчатки.

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:titleString?titleString:@"" attributes:@{ NSFontAttributeName: button.titleLabel.font}];

[buttonTitleString addAttribute:NSUnderlineStyleAttributeName value:[CommonUtil getValueForUnderlineStyle] range:NSMakeRange(0, [buttonTitleString length])];
[button.titleLabel setAttributedText:attributedString];

+ (NSNumber *)getValueForUnderlineStyle {
NSNumber *numberToReturn = @(NSUnderlineStyleSingle);
if(!(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && [[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [UIScreen mainScreen].scale > 1)) {
    // Non Retina iPad
    numberToReturn = @(NSUnderlineStyleDouble);
}
return numberToReturn;
}
person AtB    schedule 03.10.2018