2012-03-26 3 views
2

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

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

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

  • NSBezierPath и transformUsingAffineTransform: против .
  • сочетание NSAffineTransform применяется к виду и NSString drawAtPoint:

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

Purple = NSString drawAtPoint, Grey = NSBezierPath fill

Серый Безье представление строки нарисована с использованием:

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

и фиолетовая строка через

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

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


UPDATE # 1

Похоже, это кипение вниз к различным ограничивающими коробки возвращенных

  • NSString sizeWithAttributes:
  • NSBezierPath bounds

Теперь экспериментирует с NSString бо undingRectWithSize

+0

Границы рисунка не такой же, как размер текста. Например, большой римский курсив * f * будет далеко отставать от границ поля, который возвращается 'NSAttributedString size'. – hamstergene

+0

Да, поэтому я перешел на 'boundingRectWithSize'. Хорошее введение в различные размеры шрифта можно найти здесь (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/FontHandling/Tasks/GettingFontMetrics.html), где sizeWithAttributes, похоже, использует внешнюю ограничительную рамку, а 'NSBezierPath ограничивает 'фактическую площадь, занимаемую глифами. – Jay

ответ

0

FWIW - Работает сейчас.

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

компенсировало NSBezierPath вернулся из bezierWithFont: на эту сумму, и вы хорошо идти ..