Как я могу центрировать NSAttributedString, независимо от атрибутов? - PullRequest
3 голосов
/ 13 ноября 2011

Я хочу нарисовать NSAttributedString для пользовательского вида и центрировать его по вертикали, независимо от шрифта, размера и т. Д. Строка - это всего лишь небольшое число от 1 до 99.

До сих пор я пытался вызвать метод [NSAttributedString size], чтобы позволить мне определить высоту строки, как нарисовано. План состоял в том, чтобы затем использовать фигуру высоты для центрирования строки при рисовании, используя drawInRect: или drawAtPoint:. Проблема, которую я имею, состоит в том, что высота, возвращаемая из метода размера, больше, чем нарисованные глифы. После небольшого эксперимента кажется, что метод size: возвращает высоту самых высоких возможных глифов с этими атрибутами, включая спуски и т. Д., А не высоту отдельных глифов в моем NSAttributedString.

UPDATE:

Как упомянул Джошуа Ноззи в своем ответе, я могу оценить, что максимальная высота - это то, что вы хотели бы использовать для вертикального центрирования, поскольку это предотвратит ваш текст по вертикали при изменении строки. Однако в моем случае я хочу визуально отцентрировать число, например «10», часто внутри круга. Это фактическая высота линии «10», о которой я забочусь, делая это.

Как бы я получил ограничивающий прямоугольник, который тесно связан с реальными нарисованными глифами? Я думаю, что я могу получить что-то с использованием Core Text и функции CTLineGetImageBounds(); Тем не менее, это много кода. Если бы я мог сделать это без использования такого подробного / низкоуровневого кода, это было бы лучше.

Мне известно, что я мог полностью лаять не тем деревом с помощью описанного выше метода. Какой метод вы бы предложили? Нужно ли начинать использовать текст какао / основной текст напрямую, а не использовать дополнения к NSAttributedString?

Текстовая система в Mac OS настолько многофункциональна, что немного пугает новичка, такого как я. Любая помощь с благодарностью.

1 Ответ

5 голосов
/ 13 ноября 2011

Во-первых, вам определенно нужно поведение высоты, которое вы описали.Представьте, что нарисованная строка меняется с использования символов, которым не нужна эта «дополнительная» высота, на использование символов, которые нуждаютсяНарисованная строка будет прыгать по вертикали.Нехорошо. Определенно используйте высоту, заданную текстовой системой для указанного шрифта.

Чтобы ответить на ваш главный вопрос, drawInRect: перенесет ширину предоставленного прямоугольника в зависимости от атрибутов абзаца.Если вы вообще не хотите беспокоиться о переносе, лучше использовать -drawAtPoint: и вычислить центр вручную.Вертикальный центр - это половина высоты предлагаемого прямоугольника, в котором вы центрируетесь, минус половина высоты -size приписанной строки (или -sizeWithAttributes обычной строки).Координата y точки NSP, которую вы предоставляете для -drawAtPoint:, может быть вычислена с помощью NSMidY(rect) - ([attrString size].height / 2).

Если вы заботитесь о переносе и уже знаете доступную ширину, вы можете использовать NSAttributedString's -boundingRectWithSize: options :.Размер, который вы передаете, должен иметь ширину, равную доступной ширине, и высоту, равную нулю.Это говорит методу, что вы хотите знать необходимую высоту при переносе на заданную ширину.Затем вы можете использовать возвращенный прямоугольник в качестве прямоугольника рисования для -drawInRect: и затем центрировать этот прямоугольник внутри любого целевого прямоугольника.

Надеюсь, это понятно и полезно.В вашем вопросе недостаточно подробностей, чтобы получить более конкретную информацию (например, что вы центрируете в , если вы разрешаете перенос, знаете ширину, но не высоту и т. Д.).

Ничего из вышеперечисленного

Основываясь на ваших комментариях и обновлениях, я думаю, что вы можете использовать - [NSBezierPath appendBezierPathWithGlyph: inFont], чтобы получить путь отдельного глифа, затем - [NSBezierPath bounds] .size, чтобы получить его размер для центрирования.Это должно дать вам только то, что на самом деле нарисовано из отдельного глифа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...