Подтвердить что ты не робот

UILabel отключает пользовательский шрифт. Как динамически настроить высоту UILabel на основе выбранного пользовательского шрифта?

Некоторые пользовательские шрифты, загруженные в мое приложение, обрезаются при отображении в UILabel. У меня есть несколько настраиваемых шрифтов, которые мне нужно правильно отображать. Как я могу это исправить?

4b9b3361

Ответ 1

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

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

Это было бы хорошо, если бы мне не пришлось делать это для 20 + шрифтов. Поэтому я решил копаться и посмотреть, могу ли я получить доступ к значениям ascender и descender. Оказывается, UIFont имеет те точные атрибуты!

С этой информацией я смог подклассифицировать UILabel и динамически настраивать его фрейм, добавив значения высоты и затухания (используйте абсолютное значение как отрицательное) до его высоты.

Ниже приведен фрагмент кода реализации, последняя строка - денежная линия:

UIFont *font = [UIFont fontWithName:nameOfFontUsed size:44.0];
NSDictionary *attrsDict = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
NSMutableAttributedString *theString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@", enteredString] attributes:attrsDict];

//Add other attributes you desire

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;
paragraphStyle.lineHeightMultiple = 5.0;
[theString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [theString length])];

[self setAttributedText:theString];

[self sizeToFit];

[self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height+font.ascender+ABS(font.descender))];

Ответ 2

Попробуйте переопределить свойство intrinsicContentSize в UILabel.

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

Пример для Swift 3

class ExpandedLabel: UILabel {

  override var intrinsicContentSize: CGSize {

    let size = super.intrinsicContentSize

    // you can change 'addedHeight' into any value you want.
    let addedHeight = font.pointSize * 0.3

    return CGSize(width: size.width, height: size.height + addedHeight)
  }
}