Ich möchte ein NSTextAttachment
Bild an meine zugewiesene Zeichenfolge anhängen und es vertikal zentrieren lassen.
Ich habe den folgenden Code verwendet, um meine Zeichenfolge zu erstellen:
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:DDLocalizedString(@"title.upcomingHotspots") attributes:attrs];
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [[UIImage imageNamed:@"help.png"] imageScaledToFitSize:CGSizeMake(14.f, 14.f)];
cell.textLabel.attributedText = [str copy];
Das Bild scheint jedoch am oberen Rand der Zelle ausgerichtet zu sein textLabel
.
Wie kann ich das Rechteck ändern, in dem der Anhang gezeichnet ist?
ios
objective-c
swift
uilabel
nstextattachment
Sean Danzeiser
quelle
quelle
Antworten:
Sie können das Rect durch Unterklassen
NSTextAttachment
und Überschreiben ändernattachmentBoundsForTextContainer:proposedLineFragment:glyphPosition:characterIndex:
. Beispiel:Es ist keine perfekte Lösung. Sie müssen den Y-Ursprung „mit dem Auge“ herausfinden. Wenn Sie die Schriftart oder die Symbolgröße ändern, möchten Sie wahrscheinlich den Y-Ursprung ändern. Aber ich konnte keinen besseren Weg finden, als das Symbol in einer separaten Bildansicht zu platzieren (was seine eigenen Nachteile hat).
quelle
Sie können die capHeight der Schriftart verwenden.
Ziel c
Schnell
Das Anhangsbild wird auf der Grundlinie des Textes gerendert. Und die y-Achse ist wie das Kerngrafikkoordinatensystem umgekehrt. Wenn Sie das Bild nach oben verschieben möchten, setzen Sie den Wert
bounds.origin.y
auf positiv.Das Bild sollte vertikal mittig mit der Höhe des Texts ausgerichtet sein. Also müssen wir die festlegen
bounds.origin.y
zu(capHeight - imageHeight)/2
.Um einen gezackten Effekt auf das Bild zu vermeiden, sollten wir den Bruchteil des y runden. Aber Schriftarten und Bilder sind normalerweise klein. Selbst ein Unterschied von 1 Pixel lässt das Bild falsch ausgerichtet aussehen. Also habe ich die Rundungsfunktion vor dem Teilen angewendet. Dadurch wird der Bruchteil des y-Werts auf .0 oder .5 gesetzt
In Ihrem Fall ist die Bildhöhe größer als die Großbuchstaben der Schriftart. Aber Sie können den gleichen Weg verwenden. Der Offset-y-Wert ist negativ. Und es wird von unten unter der Grundlinie angelegt.
quelle
Versuchen Sie es
- [NSTextAttachment bounds]
. Keine Unterklasse erforderlich.Für den Kontext rendere ich ein
UILabel
zur Verwendung als Anhangsbildattachment.bounds = CGRectMake(0, self.font.descender, attachment.image.size.width, attachment.image.size.height)
und setze dann die Grenzen wie folgt : und die Basislinien des Textes innerhalb des Beschriftungsbilds und des Textes in der zugeordneten Zeichenfolge werden wie gewünscht ausgerichtet.quelle
attachment.bounds = CGRect(x: 0.0, y: self.font.descender, width: attachment.image!.size.width, height: attachment.image!.size.height)
descender
Wusste nichts über das Eigentum von UIFont!Ich habe eine perfekte Lösung dafür gefunden, funktioniert aber wie ein Zauber für mich, aber Sie müssen es selbst ausprobieren (wahrscheinlich hängt die Konstante von der Auflösung des Geräts ab und vielleicht was auch immer;)
Sollte funktionieren und sollte in keiner Weise verschwommen sein (danke an
CGRectIntegral
)quelle
Wie wäre es mit:
Keine Unterklasse erforderlich
quelle
@Travis ist richtig, dass der Offset der Font-Absender ist. Wenn Sie das Bild auch skalieren müssen, müssen Sie eine Unterklasse von NSTextAttachment verwenden. Unten finden Sie den Code, der von diesem Artikel inspiriert wurde . Ich habe es auch als Kern gepostet .
Verwenden Sie wie folgt:
quelle
Wenn Sie einen sehr großen Aufstieg haben und das Bild (Mitte der Kappenhöhe) wie ich zentrieren möchten, versuchen Sie dies
Die y-Berechnung ist wie im Bild unten
Beachten Sie, dass der y-Wert 0 ist, da das Bild vom Ursprung nach unten verschoben werden soll
Wenn Sie möchten, dass es sich in der Mitte des gesamten Etiketts befindet. Verwenden Sie diesen y-Wert:
quelle
Wir können in Swift 4 eine Erweiterung erstellen, die einen Anhang mit einem zentrierten Bild wie diesem generiert:
Dann können Sie den Anruf tätigen und den Namen des Bildes und die Schriftart senden:
Fügen Sie dann das imageAttachment an den attributedString an
quelle
In meinem Fall hat das Aufrufen von sizeToFit () geholfen. In kurzer Zeit 5.1
In Ihrem benutzerdefinierten Etikett:
quelle
Bitte verwenden Sie -lineFrag.size.height / 5.0 für die Grenzhöhe. Dadurch wird das Bild genau zentriert und für alle Schriftgrößen an Text ausgerichtet
quelle
-lineFrag.size.height/5.0
das ist nicht richtig. Stattdessen ist es der Font-Absender.