2010-10-10 6 views
9

Ich kann Rich-Text mit Core Text zeichnen, das Problem besteht darin, Bilder mit dem Text fließen. (iOS SDK 4.1)Wie zeichne ich Bilder mit Rich Text mit CoreText? (iOS)

Ich versuche, eine Art von Rich-Text zu zeichnen. Problem ist Designer platziert viele Symbole unter Text. So ist der Text, was ich zeichnen müssen, ist so etwas wie dieses:

Here is a word <an icon image>, and another words. 
The image(<another icon>) should be placed like a glyph. 
It's part of text, not an example. 

<icon> sind Bilder. (Dies ist kein Code. Nur eine Illustration.)

Ich kann dies zeichnen, indem Sie alle manuell, aber es ist zu hart, komplexe Text Layout-Verhaltensweisen zu halten. Also finde ich einen Weg, dies mit Core Text zu zeichnen.

Antwort

9

Ich habe eine Lösung.

Der Schlüssel zum Auslegen von Nicht-Text-Inhalten ist CTRunDelegate. Core Text unterstützt keinen Nicht-Text-Inhalt, daher müssen Sie Leerzeichen für sie erstellen und sie später selbst zeichnen oder platzieren.

Ein Teil von NSAttributedString, der mit kCTRunDelegateAttributeName zugeordnet ist, ruft einen registrierten Rückruf auf, um die Breite jedes Symbols zu bestimmen. Auf diese Weise können Sie für jedes Nichttextobjekt einen leeren Bereich erstellen.

Nach dem Zeichnen des Textes mit Core Text werden jedoch die Layoutinformationen ungültig, die mit Frame/Zeile/Lauf gespeichert wurden. Sie müssen also Nicht-Textinhalte nach dem Layout mit Framesetter/Schriftsetzer zeichnen, aber vor dem Zeichnen.

Dieser Link beschreibt grundlegende Verwendung von CTRunDelegate:
How to use CTRunDelegate in iPad?


Es gibt ein Problem mit Core Text ist. Ursprünglich CTRunDelegate entworfen, um variable Breite und vertikale Ausrichtung über CTRunDelegateCallbacks.getAscent und CTRunDelegateCallbacks.getDescent zu unterstützen. Die vertikale Ausrichtung funktioniert derzeit jedoch nicht. Dies könnte ein Fehler sein.

ich beschrieben, dieses Problem hier: Aligning multiple sized text vertical center instead of baseline with Core Text in iOS

Wenn Sie Informationen zu diesem Problem haben, bitte meine Frage an den Link sehen.

3

Sie legen einfach einen Delegaten für ein bestimmtes CTRun fest, und das Delegatobjekt ist dafür verantwortlich, Core Text wissen zu lassen, was der CTRun-Aufstiegsraum, der Abstiegsraum und die Breite ist.

Wenn Core Text ein CTRun "erreicht", das ein CTRunDelegate hat, fragt es den Delegaten - wie viel Breite sollte ich für diesen Datenblock lassen, wie hoch sollte es sein? Auf diese Weise baust du ein Loch in den Text - dann machst du dein Bild genau an diesem Punkt. Hier

enter image description here

ist ein Blog über den Core-Text.It hat die Antwort für Sie.

How To Create a Simple Magazine App with Core Text