Я хочу добавить NSTextAttachment
изображение к моей атрибутированной строке и расположить его по центру по вертикали.
Я использовал следующий код для создания своей строки:
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:DDLocalizedString(@"title.upcomingHotspots") attributes:attrs];
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [[UIImage imageNamed:@"help.png"] imageScaledToFitSize:CGSizeMake(14.f, 14.f)];
cell.textLabel.attributedText = [str copy];
Однако изображение кажется выровненным по верхнему краю ячейки textLabel
.
Как я могу изменить прямоугольник, в котором нарисовано вложение?
ios
objective-c
swift
uilabel
nstextattachment
Шон Данцайзер
источник
источник
Ответы:
Вы можете изменить прямоугольник путем создания подклассов
NSTextAttachment
и переопределенияattachmentBoundsForTextContainer:proposedLineFragment:glyphPosition:characterIndex:
. Пример:Это не идеальное решение. Вы должны определить Y-начало «на глаз», и если вы измените шрифт или размер значка, вы, вероятно, захотите изменить Y-начало. Но я не мог найти лучшего способа, кроме как поместить значок в отдельное изображение (что имеет свои недостатки).
источник
Вы можете использовать capHeight шрифта.
Objective-C
стриж
Изображение вложения отображается на основе текста. И его ось y перевернута, как и система координат основной графики. Если вы хотите переместить изображение вверх, установите
bounds.origin.y
положительное значение.Изображение должно быть выровнено по вертикали по центру с capHeight текста. Итак, нам нужно установить
bounds.origin.y
значение(capHeight - imageHeight)/2
.Чтобы избежать эффекта зубчатости на изображении, мы должны округлить дробную часть y. Но шрифты и изображения обычно маленькие, даже разница в 1 пиксель заставляет изображение выглядеть смещенным. Поэтому перед делением я применил функцию округления. Это делает дробную часть значения y равной 0,0 или 0,5
В вашем случае высота изображения больше, чем capHeight шрифта. Но можно использовать так же. Значение смещения y будет отрицательным. И он будет выложен снизу базовой линии.
источник
Попробуй
- [NSTextAttachment bounds]
. Создание подклассов не требуется.Для контекста я визуализирую a
UILabel
для использования в качестве изображения вложения, а затем устанавливаю границы следующим образом:attachment.bounds = CGRectMake(0, self.font.descender, attachment.image.size.width, attachment.image.size.height)
и базовые линии текста в изображении метки и текст в атрибутированной строке выстраиваются по желанию.источник
attachment.bounds = CGRect(x: 0.0, y: self.font.descender, width: attachment.image!.size.width, height: attachment.image!.size.height)
descender
собственности UIFont!Я нашел идеальное решение для этого, хотя работает для меня как шарм, однако вы должны попробовать это самостоятельно (вероятно, константа зависит от разрешения устройства и, возможно, чего-то еще;)
Должен работать и ни в коем случае не должен быть размытым (спасибо
CGRectIntegral
)источник
Что о:
Подклассы не нужны
источник
@Travis правильно, что смещение - это спускаемый элемент шрифта. Если вам также необходимо масштабировать изображение, вам нужно будет использовать подкласс NSTextAttachment. Ниже приведен код, вдохновленный этой статьей . Я также разместил это как суть .
Используйте следующим образом:
источник
Если у вас очень большой восходящий элемент и вы хотите центрировать изображение (центр высоты крышки), как я, попробуйте это
Расчет y как на картинке ниже
Обратите внимание, что значение y равно 0, потому что мы хотим, чтобы изображение сместилось вниз от начала координат.
Если вы хотите, чтобы он находился посередине всей метки, используйте это значение y:
источник
Мы можем сделать расширение в swift 4, которое будет генерировать вложение с центрированным изображением, подобным этому:
Затем вы можете сделать вызов, отправив имя изображения и шрифт:
А затем добавьте imageAttachment в attributedString
источник
В моем случае помог вызов sizeToFit (). В быстрой 5.1
Внутри вашей специальной метки:
источник
Используйте -lineFrag.size.height / 5.0 для высоты границ. Это точно центрирует изображение и выравнивается по тексту для всех размеров шрифтов.
источник
-lineFrag.size.height/5.0
не является правильным. Вместо этого это дескриптор шрифта.