Ich möchte ein gefülltes Rechteck nehmen und ein Loch in eine andere Form stanzen. Genau dafür ist NSBezierPath
gedacht. Sie fügen einen rechteckigen Pfad hinzu und fügen dann den Unterpfad hinzu, der ihn durchstoßen und schließlich ausfüllen wird. In meinem Fall ist der Unterpfad tatsächlich Text. Kein Problem, funktioniert super:
Außer wenn ich Helvetica Neue Bold für meine Schriftart verwende. Wenn ich das benutze, habe ich nur ein blaues Rechteck ohne Text. Aber der Unterpfad zeichnet tatsächlich - in der Tat, wenn ich das gefüllte Rechteck etwas verkleinere, können Sie tatsächlich einen Teil des Textpfads sehen:
Ich bekomme das gleiche Verhalten mit Helvetica Neue Italic. Helvetica Neue Medium funktioniert ebenso gut wie Helvetica Bold, Times New Roman Bold und Arial Bold.
Ich habe versucht, NSEvenOddWindingRule
und NSNonZeroWindingRule
zu verwenden. ( BEARBEITEN : Anscheinend habe ich NSEvenOddWinding
rule nicht wirklich probiert, weil das schließlich funktioniert)
Dies ist der Code, den ich in der drawRect
Methode meiner NSView
Unterklasse verwende.
Also, was ist hier los? Warum verhalten sich einige Schriftarten anders als andere, wenn es darum geht, einem Pfad Glyphen hinzuzufügen?
BEARBEITEN : Die Lösung besteht darin, NSEvenOddWindingRule
zu verwenden. Fügen Sie nach der Erstellung von path
diese Zeile hinzu:
Peter Hoseys Antwort liefert die Erklärung, warum das so ist.
Es hat wahrscheinlich mit den Richtungen der Pfade in den Fonts zu tun. Eine Schriftart kann im Uhrzeigersinn Pfade verwenden; ein anderer kann Pfade gegen den Uhrzeigersinn verwenden.
Ein zuverlässigerer Weg, um den gewünschten Effekt zu erzielen, wäre, das Rechteck einfach zu füllen und dann den Text mit dem Compositing-Modus des Grafikkontexts auf NSCompositeSourceOut
zu zeichnen. Sie können die Füll- und Textzeichnung in einer Transparenzebene mithilfe von Core Graphics umschließen, wenn Sie den Text nur aus der Füllung herausschneiden möchten.
Tags und Links objective-c cocoa fonts typography core-graphics