2012-03-26 43 views
2

我需要對(可能巨大的)數量的組件執行高效的命中測試,因此我已將所有基元表示爲NSBezierPath實例。迄今爲止所有的工作都很棒NSString繪圖與字符串作爲NSBezierPath繪圖

現在我無法轉換NSString物體,特別是反映了他們在視圖中的位置: 我使用蘋果的SpeedometerView例如NSString (BezierConversions)類別字符串轉換成貝塞爾路徑。

字符串創建的貝塞爾曲線看起來很大,但它定位匹配在視圖中NSString實例場所的位置完全不是那麼回事,所以我想這個問題實際上是關於

  • NSBezierPathtransformUsingAffineTransform: VS 。
  • 應用的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]; 

相同的屬性,相同的輸入的位置,不同的位置在視紫字符串。
它旋轉的文字變得更糟。


更新#1

看起來像它的熬煮返回不同的邊框由

  • NSString sizeWithAttributes:
  • NSBezierPath bounds

現在用NSString試驗博undingRectWithSize

+0

繪製的邊界是不一樣的文字的大小。例如,一個大的羅馬斜體* f *將遠遠落後於'NSAttributedString size'返回的框的邊界。 – hamstergene 2012-03-27 07:01:07

+0

是的,這就是爲什麼我切換到'boundingRectWithSize'。關於各種字體維度的好介紹可以在這裏找到(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/FontHandling/Tasks/GettingFontMetrics。html)其中sizeWithAttributes似乎使用外邊界框和'NSBezierPath bounds'這些字形佔用的實際區域。 – Jay 2012-03-27 07:02:41

回答

0

FWIW - 正在工作。

使用boundingRectWithSize:options:attributes:NSStringDrawingUsesDeviceMetrics選項提供了一些很好的文本維度,包括繪製時字符串佔用的實際邊界框和第一個字形的偏移量。

偏移的NSBezierPath從bezierWithFont返回:由量,你是好去..