Во-первых, вам определенно нужно поведение высоты, которое вы описали.Представьте, что нарисованная строка меняется с использования символов, которым не нужна эта «дополнительная» высота, на использование символов, которые нуждаютсяНарисованная строка будет прыгать по вертикали.Нехорошо. Определенно используйте высоту, заданную текстовой системой для указанного шрифта.
Чтобы ответить на ваш главный вопрос, drawInRect: перенесет ширину предоставленного прямоугольника в зависимости от атрибутов абзаца.Если вы вообще не хотите беспокоиться о переносе, лучше использовать -drawAtPoint: и вычислить центр вручную.Вертикальный центр - это половина высоты предлагаемого прямоугольника, в котором вы центрируетесь, минус половина высоты -size приписанной строки (или -sizeWithAttributes обычной строки).Координата y точки NSP, которую вы предоставляете для -drawAtPoint:, может быть вычислена с помощью NSMidY(rect) - ([attrString size].height / 2)
.
Если вы заботитесь о переносе и уже знаете доступную ширину, вы можете использовать NSAttributedString's -boundingRectWithSize: options :.Размер, который вы передаете, должен иметь ширину, равную доступной ширине, и высоту, равную нулю.Это говорит методу, что вы хотите знать необходимую высоту при переносе на заданную ширину.Затем вы можете использовать возвращенный прямоугольник в качестве прямоугольника рисования для -drawInRect: и затем центрировать этот прямоугольник внутри любого целевого прямоугольника.
Надеюсь, это понятно и полезно.В вашем вопросе недостаточно подробностей, чтобы получить более конкретную информацию (например, что вы центрируете в , если вы разрешаете перенос, знаете ширину, но не высоту и т. Д.).
Ничего из вышеперечисленного
Основываясь на ваших комментариях и обновлениях, я думаю, что вы можете использовать - [NSBezierPath appendBezierPathWithGlyph: inFont], чтобы получить путь отдельного глифа, затем - [NSBezierPath bounds] .size, чтобы получить его размер для центрирования.Это должно дать вам только то, что на самом деле нарисовано из отдельного глифа.