2012-03-26 8 views
2

Ich muss effiziente Hit-Tests gegen eine (potenziell große) Anzahl von Komponenten durchführen, so dass ich alle meine Primitiven als NSBezierPath Instanzen vertreten. Alles funktioniert bisher sehr gut.NSString Zeichnung im Vergleich zu String als NSBezierPath Zeichnung

Jetzt bin ich Probleme Umwandlung NSString Gegenstände, insbesondere ihre Position in der Ansicht widerspiegelt: Ich verwende die NSString (BezierConversions) Kategorie von Apples SpeedometerView Beispiel Strings in Bezier-Pfade zu konvertieren.

Der Bezier-Pfad für Strings erstellt sieht gut aus, sondern positionieren sie die Position des NSString Instanzen Lage in der Ansicht übereinstimmen funktioniert nicht ganz so nehme ich an diese Frage wirklich über

ist
  • NSBezierPath und transformUsingAffineTransform: vs .
  • eine Kombination aus NSAffineTransform zu einer Ansicht und NSString drawAtPoint:

In meinem Testprojekt auch der triviale Fall nicht angewandt :

Purple = NSString drawAtPoint, Grey = NSBezierPath fill

Grau Bezier Darstellung Zeichenkette gezeichnet werden:

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

und die purpurne Zeichenfolge über

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

gleiche Attribute, gleiche Eingangspositionen, andere Position in der Ansicht.
Und es wird nur schlimmer mit gedrehten Text.


UPDATE # 1

Sieht aus wie es von

  • NSString sizeWithAttributes:
  • NSBezierPath bounds

jetzt das Experimentieren mit NSString bo nach unten zu verschiedenen Begrenzungskästen zurück kocht endingRectWithSize

+0

Bounds der Zeichnung ist nicht die gleiche wie Größe des Textes. Zum Beispiel wird eine große römische Kursivschrift * f * weit hinter den Grenzen der Box, die von 'NSAttributedString size' zurückgegeben wird, gezeichnet. – hamstergene

+0

Ja, deshalb bin ich zu 'boundingRectWithSize' gewechselt. Gute Intro über verschiedene Schriftgrößen finden Sie [hier] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/FontHandling/Tasks/GettingFontMetrics.html), wo sizeWithAttributes die äußere Begrenzungsbox zu verwenden scheint und 'NSBezierPath bounds' die tatsächliche Fläche, die von den Glyphen belegt wird. – Jay

Antwort

0

FWIW - Arbeiten jetzt.

Die Verwendung von boundingRectWithSize:options:attributes: mit der Option NSStringDrawingUsesDeviceMetrics bietet einige gute Textdimensionen, mit denen gearbeitet werden kann, einschließlich der tatsächlichen Begrenzungsbox, die von der Zeichenkette belegt wird, wenn sie gezeichnet wird, und dem Offset des ersten Zeichens.

Offset der NSBezierPath von bezierWithFont zurückgegeben: um diesen Betrag, und Sie sind gut zu gehen ..