У меня есть NSAttributedString, который сообщает о boundingRectWithSize (и, соответственно, о UITextView, который неправильно вычисляет свой sizeThatFits), когда размер шрифта уменьшается по сравнению с размером шрифта, который использовался для его создания.
Это происходит не со всеми NSAttributedString, для которых я выполняю аналогичные операции, поэтому здесь приведены шаги для воспроизведения.
- Используйте нестандартный шрифт, который не включает полный набор символов Unicode.
- Убедитесь, что строка содержит символы из этого «неподдерживаемого» набора. iOS отобразит их как Helvetica нужного размера.
- Уменьшите шрифт во всех атрибутах шрифта в NSAttributedString. Мой код для этого, вызвавший проблему, выглядит следующим образом.
Изнутри подкласса UITextView:
NSMutableAttributedString *mutableString = [self.attributedText mutableCopy];
[mutableString enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, mutableString.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {
if (value) {
UIFont *oldFont = (UIFont *)value;
UIFont *newFont = [oldFont fontWithSize:oldFont.pointSize - 1];
[mutableString removeAttribute:NSFontAttributeName range:range];
[mutableString addAttribute:NSFontAttributeName value:newFont range:range];
}
}];
self.attributedText = [mutableString copy];
Я заметил, что при запуске этого кода в цикле while
проверяется sizeThatFits, чтобы знать, когда текст достаточно мал, чтобы вместиться, и в некоторых обстоятельствах у меня будет гонка до нуля. Высота рассчитывается как 60 пикселей для любого значения шрифта, меньшего, чем то, с которого я начал, что составляет 50 пикселей.
При NSLog
инге NSAttributedString я обнаружил, что есть несколько атрибутов, которые я не добавил с ключом NSOriginalFont
, которого нет в списке поддерживаемых атрибутов здесь. Что происходит с NSOriginalFont? Почему мой размер рассчитывается неправильно?
UITextView
, что в некоторых случаях может вставить атрибут. - person Tom Harrington   schedule 28.12.2017