2009-07-19 7 views
2

Ist es möglich, die Koordinaten zu erhalten, wo der Text in standardmäßigen (nicht benutzerdefinierten) Cocoa-Steuerelementen gezeichnet wird? Eigentlich benötige ich eine Grundlinie des Textes, den Versatzwert der Y-Achse (relativ zum y-Ursprung des Rahmenrechtecks ​​der Ansicht). Dies zeigt der Interface Builder im Designfenster, wenn Layout-> Layoutrechtecke anzeigen ausgewählt ist.Cocoa steuert die Textposition?

Antwort

2

Leider gibt es keine einzige Lösung, die für alle Steuerelemente und Zellen funktioniert. Sie sollten eine gute Annäherung dieser Informationen mit diesen Methoden erhalten können:

-[NSCell titleRectForBounds:] 
-[NSCell font] 
-[NSFont ascender] 

Hier ist ein Code, der funktioniert für NSButton/NSButtonCell

NSRect titleRect = [[button cell] titleRectForBounds:[button bounds]]; 
CGFloat baseline = ceil(NSMinY(titleRect) + [[[button cell] font] ascender]); 

An diesem Punkt ist der Basislinie in der Schaltfläche (Grenzen) Koordinatenraum. Möglicherweise möchten Sie es mit [NSView convertPoint: toView:] in einen anderen Speicherbereich konvertieren.

Auch diese "Ceil" in dort ist eine Annäherung. Nicht alle Kontrollen werden das tun. Einige könnten Boden oder andere Rundungsfunktion verwenden. Oder sie können ihren Titel völlig anders gestalten, und diese Approximation wird nicht funktionieren.

+2

Dies kann ein echter Schmerz sein, um richtig zu werden. In Adobe Lightroom haben wir ein eigenes Layoutsystem für Steuerelemente. Ein Werkzeug, mit dem man überprüfen konnte, wo die Basislinie für den Text gezeichnet wurde, war, mit Hilfe von poseAs einen Debugging-Code hinzuzufügen: und einen globalen Zeichnungscode einzufügen, der die normale Zeichnung überlagert. Im Wesentlichen können wir dies in Debug-Builds aktivieren, um zu zeigen, wo sich die Basislinie auf allen Controls befindet, die uns wichtig sind. Wenn Sie viel davon tun, kann es am Ende sparen Sie Zeit. Ich kann keinen Code aufgrund der proprietären Natur teilen, sorry. –

+0

poseAs: war in Leopard veraltet;) – IlDan