Мне нужно выполнить эффективное тестирование попадания для (потенциально огромного) количества компонентов, поэтому я представил все свои примитивы как NSBezierPath
экземпляры. Все отлично работает до сих пор.
Теперь у меня возникли проблемы с преобразованием объектов NSString
, в частности с отражением их положения в представлении: я использую категорию NSString (BezierConversions)
из примера Apple SpeedometerView для преобразования строк в пути Безье.
Путь Безье, созданный для строк, выглядит великолепно, но его позиционирование в соответствии с положением экземпляров NSString
в представлении не совсем работает, поэтому я полагаю, что этот вопрос действительно о
NSBezierPath
иtransformUsingAffineTransform:
vs.- комбинация
NSAffineTransform
, примененная к представлению, иNSString drawAtPoint:
В моем тестовом проекте даже тривиальный случай не работает:
Серое безье-представление строки, нарисованной с использованием:
NSAffineTransform *moveFinal = [NSAffineTransform transform];
[moveFinal translateXBy:x yBy:y];
[textBezier transformUsingAffineTransform:moveFinal];
и фиолетовая нить через
[testString drawAtPoint:NSMakePoint(x, y)
withAttributes:attributes];
Те же атрибуты, те же позиции ввода, другое место в поле зрения.
И с повернутым текстом все становится еще хуже.
ОБНОВЛЕНИЕ №1
Похоже, все сводится к разным ограничивающим рамкам, возвращаемым
NSString sizeWithAttributes:
NSBezierPath bounds
Теперь экспериментируем с NSString
boundingRectWithSize.
NSAttributedString size
. - person hamstergene   schedule 27.03.2012boundingRectWithSize
. Хорошее введение в различные размеры шрифта можно найти здесь, где sizeWithAttributes, по-видимому, использует внешнюю ограничивающую рамку иNSBezierPath bounds
фактическую область, занимаемую глифами. - person Jay   schedule 27.03.2012