Воскрешение.
При первоначальном определении того, где линии должны быть размещены в кадре, Базовый текст, кажется, массирует подъем + спуск для целей расчета начала линии. В частности, кажется, что 0,2 * (подъем + спуск) добавляется к восхождению, а затем и спуск, и результирующее восхождение изменяются на floor(x + 0.5)
, и затем базовые позиции рассчитываются на основе этих скорректированных подъемов и спусков. На оба этих шага влияют определенные условия, характер которых я не уверен, и я также уже забыл, в какой момент стили абзацев принимаются во внимание, несмотря на то, что изучал их только несколько дней назад.
Я уже смирился с тем, что просто рассматриваю линию, начинающуюся с ее базовой линии, и не пытаюсь выяснить, в какой точке приземляются настоящие линии. К сожалению, этого все еще не достаточно: стили абзаца не отражены в CTLineGetTypographicBounds()
, и некоторые шрифты, такие как Klee, имеющие ненулевые начальные значения, пересекают прямоугольник пути! Не уверен, что с этим делать ... возможно, для другого вопроса.
UPDATE
Кажется, CTLineGetBoundsWithOptions(line, 0)
действительно получает правильные границы линий, но не совсем полностью: между строками есть разрыв, а с некоторыми шрифтами (снова Клее) разрыв отрицательный, и линии перекрываются ... Не уверен, что делать об этом. : | По крайней мере, мы немного ближе ??
И даже тогда он по-прежнему не учитывает стили абзацев>: |
CTLineGetBoundsWithOptions()
не указан на сайте документации Apple, возможно, из-за ошибки в текущей версии их генератора документации. Однако это полностью документированный API - вы найдете его в заголовочных файлах, и он подробно обсуждался на сессии 226. WWDC 2012.
Ни один из вариантов не имеет отношения к нам: они уменьшают прямоугольник границ, принимая во внимание определенные варианты дизайна шрифта (или увеличивают прямоугольник границ случайным образом, в случае нового kCTLineBoundsIncludeLanguageExtents
). В общем, одна полезная опция - это kCTLineBoundsUseGlyphPathBounds
, что эквивалентно CTLineGetImageBounds()
, но без необходимости указывать CGContext
(и, следовательно, без учета существующей текстовой матрицы или CTM).