Почему рисование с использованием CoreText требует увеличения размера CGRect?

#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 .