2010-09-26 12 views
10

Hier ist ein Screenshot von dem Twitter-App für Referenz: http://screencast.com/t/YmFmYmI4MiPhone Core: Finden Sie die Pixelkoordinaten eines Teil

Was ich tun möchte, ist Platz eines Floating-Pop-over auf einen Teil in einer NSAttributedString das könnte Überspannen Sie mehrere Zeilen. NSAttributedString ist eine Voraussetzung für das Projekt.

In dem Screenshot können Sie sehen, dass Links im Hintergrund hervorgehoben sind, so dass ich glaube, dass sie CoreText und NSAttributedStrings verwenden. Ich habe auch etwas namens CTRunRef (http://developer.apple.com/library/ios/#documentation/Carbon/Reference/CTRunRef/Reference/reference.html) gefunden, das vielversprechend aussieht, aber ich habe Probleme damit, es konzeptionell zusammenzufassen.

Kurz gesagt, wenn ich einen Absatz im Kerntext habe und wenn ich auf ein Wort tippe, wie finde ich die Bounding Box für dieses Wort?

Antwort

8

einige Attribute in dem zurück String Set, das nicht Anzeige bewirken, sondern wird dazu führen, dass als separater Glyphe Lauf angelegt wird, dann Core verwenden die Zeichenfolge müssen Layout

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString); 
CTFrameRef ctframe = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL); 

Jetzt Sie durch den Rahmen zu jagen, um den relevanten Textabschnitt zu finden. Holen Sie sich das Array CTLineRef s mit CTFrameGetLines().

Iterieren durch das Array, testen, ob die Berührung in dieser Zeile war, indem Sie überprüfen, ob es innerhalb der von CTLineGetImageBounds() zurückgegeben wird. Wenn es so ist, schaue jetzt durch die Glyphe in der Zeile.

Wieder können Sie ein Array von CTRunRef s mit CTLineGetGlyphRuns() erhalten. Überprüfen Sie, ob sich der Tap innerhalb des Glyphenlaufs mit CTRunGetImageBounds() befand, und wenn dies der Fall war, können Sie den Bereich der Indizes in der ursprünglichen attributierten Zeichenfolge finden, der der Glyphenlauf mit CTRunGetStringIndices() entspricht.

3

Sie müssen Y durch CTLine und X durch CTRun Breite und Höhe finden Sie nach Wort und Schrift selbst zu bekommen. Ich hänge meinen Projektlink an, seinen wirklich einfachen Code, aber du kannst ihn umschreiben, um deine Bedürfnisse zu erfüllen. hoffe es hilft prost, wenn du allgemeine logik verbesserst lass es mich wissen thx. textViewProject

+0

Bitte fragen Sie nicht in Antworten. Erstellen Sie eine neue Frage und verlinken Sie hier. – vikingosegundo

+0

Vikingosegundo - das sieht tatsächlich wie eine gültige Antwort aus. Danke für den Link George! – jtrim

+0

Sie sind herzlich willkommen lassen Sie es mich wissen, wenn Sie Fragen haben. –

0

Ich habe an einer kleinen Bibliothek gearbeitet, die genau das tut. Sie können es hier finden: https://github.com/pothibo/CMFramework

jedoch diese Bibliothek in seiner Alpha-Stadium ist, gibt es die Optimierung benötigt und einige Feature fehlen (Zeilenhöhe ist eines der dringendsten Funktion, die ich hinzufügen möchte)

Wenn Sie sich entscheiden Um es zu verwenden und Problem zu finden, zögern Sie nicht, Probleme auf GitHub zu veröffentlichen!

2

Der angegebene Link von George war sehr hilfreich und hat mir, was ich wollte. Aber etwas Seltsames ist passiert. Es funktionierte in iOS SDK 4.0, aber in der iOS SDK 5 die Position der Verknüpfung erschien in der falschen Position auf der Ansicht.

Also musste ich den Code ein wenig zwicken. Für die x-Koordinaten der berührbaren Taste musste ich CTRunGetTypographicBounds anstelle der CTRunGetImageBounds Funktion verwenden.

So über alle im gezwickt Code: Die Y-Koordinate, Breite und Höhe wurde unter Verwendung von berechnet CTRunGetImageBounds. Und x-Koordinate wurde unter Verwendung CTRunGetTypographicBounds berechnet.