Рисунок NSString против String как рисунок NSBezierPath

Мне нужно выполнить эффективное тестирование попадания для (потенциально огромного) количества компонентов, поэтому я представил все свои примитивы как NSBezierPath экземпляры. Все отлично работает до сих пор.

Теперь у меня возникли проблемы с преобразованием объектов NSString, в частности с отражением их положения в представлении: я использую категорию NSString (BezierConversions) из примера Apple SpeedometerView для преобразования строк в пути Безье.

Путь Безье, созданный для строк, выглядит великолепно, но его позиционирование в соответствии с положением экземпляров NSString в представлении не совсем работает, поэтому я полагаю, что этот вопрос действительно о

  • NSBezierPath и transformUsingAffineTransform: vs.
  • комбинация NSAffineTransform, примененная к представлению, и NSString drawAtPoint:

В моем тестовом проекте даже тривиальный случай не работает:

Фиолетовый = NSString drawAtPoint, серый = заполнение NSBezierPath

Серое безье-представление строки, нарисованной с использованием:

NSAffineTransform *moveFinal = [NSAffineTransform transform];
[moveFinal translateXBy:x yBy:y];
[textBezier transformUsingAffineTransform:moveFinal];

и фиолетовая нить через

[testString drawAtPoint:NSMakePoint(x, y)
        withAttributes:attributes];

Те же атрибуты, те же позиции ввода, другое место в поле зрения.
И с повернутым текстом все становится еще хуже.


ОБНОВЛЕНИЕ №1

Похоже, все сводится к разным ограничивающим рамкам, возвращаемым

  • NSString sizeWithAttributes:
  • NSBezierPath bounds

Теперь экспериментируем с NSStringboundingRectWithSize.


person Jay    schedule 26.03.2012    source источник
comment
Границы рисунка не совпадают с размером текста. Например, большой прямой курсив f будет отрисовываться далеко за пределы поля, возвращаемого NSAttributedString size.   -  person hamstergene    schedule 27.03.2012
comment
Да, именно поэтому я переключился на boundingRectWithSize. Хорошее введение в различные размеры шрифта можно найти здесь, где sizeWithAttributes, по-видимому, использует внешнюю ограничивающую рамку и NSBezierPath bounds фактическую область, занимаемую глифами.   -  person Jay    schedule 27.03.2012


Ответы (1)


FWIW - Сейчас работает.

Использование boundingRectWithSize:options:attributes: с параметром NSStringDrawingUsesDeviceMetrics дает хорошие размеры текста для работы, включая фактическую ограничивающую рамку, занимаемую строкой при рисовании, и смещение первого глифа.

Сместите NSBezierPath, возвращенный из bezierWithFont: на эту сумму, и все готово.

person Jay    schedule 29.03.2012