#swift #nsattributedstring #core-text #cgrect
#swift #nsattributedstring #core-text #cgrect
Вопрос:
Я пытаюсь нарисовать текст с помощью CoreText
. У меня есть следующий код:
guard let context = UIGraphicsGetCurrentContext() else { return }
let attrString = NSAttributedString(string: "Str")
let path = CGMutablePath()
// Commented code does work, why?
// path.addRect(CGRect(x: 0, y: 50, width: attrString.size().width 1, height: attrString.size().height 1))
path.addRect(CGRect(x: 0, y: 50, width: attrString.size().width, height: attrString.size().height))
let framesetter = CTFramesetterCreateWithAttributedString(attrString as CFAttributedString)
let frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attrString.length), path, nil)
CTFrameDraw(frame, context)
Почему увеличение размера CGRect
помогает, а фактический размер NSAttributedString
нет?
Любая помощь приветствуется.
Комментарии:
1. Попробуйте добавить атрибут шрифта к приписываемой строке, чтобы он рисовался известным шрифтом известного размера.
2. Кроме того, из справочной документации для
NSAttributedString size
: » Этот метод может возвращать дробные размеры. При настройке размера вашего вида используйте функцию ceil для округления дробных значений до ближайшего целого числа.» . Поэтому попробуйте использоватьCRect integral
в rect, который вы создаете.3. @rmaddy спасибо, что указали мне, я использовал неправильное название шрифта в своих тестах — «Helvetica», тогда как оно должно быть «HelveticaNeue». Это решает проблему. Возможно, вы захотите ответить на вопрос в сообщении, чтобы я мог поддержать вашу помощь. Спасибо
Ответ №1:
При работе с приписываемой строкой и получении ее размера необходимо, по крайней мере, указать шрифт. Например, размер "Str"
шрифта с 8 пунктами будет сильно отличаться от шрифта с 72 пунктами.
Это также может помочь преобразовать вычисленное CGRect
в целочисленный rect, который будет округлять любые дробные размеры. Используйте integral
свойство CGRect
.