boundingRectWithSize für NSAttributedString gibt die falsche Größe zurück
Ich versuche, das REK für ein attributiertes string, aber der boundingRectWithSize Aufruf ist nicht an die Größe, die ich übergeben und ist wieder ein rect mit einer einzigen Zeile-Höhe, im Gegensatz zu einer großen Höhe (es ist eine lange Zeichenfolge). Ich habe experimentiert, indem in einen sehr großen Wert für die Höhe und auch die 0 im code unten, aber die rect zurückgegeben wird, ist immer das gleiche.
CGRect paragraphRect = [attributedText boundingRectWithSize:CGSizeMake(300,0.0)
options:NSStringDrawingUsesDeviceMetrics
context:nil];
Wird dieser gebrochen, oder benötige ich etwas anderes zu tun zu haben, kehrte er ein REK für umbrochenen text?
InformationsquelleAutor der Frage RunLoop | 2012-11-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht aus wie Sie nicht die richtigen Optionen. Für die Verpackung Etiketten, mindestens:
Hinweis: wenn der ursprüngliche text Breite von unter 300.f es wird keinen Umbruch, so stellen Sie sicher, dass die gebundene Größe ist korrekt, sonst werden Sie immer noch falsche Ergebnisse.
InformationsquelleAutor der Antwort Ed McManus
Diese Methode scheint buggy auf vielfältige Weise. Für ein, Sie beachten es nicht respektiert, Breite-Einschränkungen. Für die anderen, ich habe gesehen, dass es abstürzt, weil es scheint, anzunehmen, dass alle Attribute sind von
NSObject
- Typ (zum Beispiel, es versucht zu übergeben_isDefaultFace
zu einemCTFontRef
). Es wird auch mal Abstürzen, wenn ein string-Zeichnung Kontext angegeben wird, da er versucht, fügen Sie eine null-Wert-Attribut, um eine veränderliche zugeschrieben string hinter die kulissen.Möchte ich Sie ermutigen, um zu vermeiden, diese Methode völlig. Sie können Kern-Text direkt zur Schätzung der die Größe der Zeichenfolge, wenn Sie behandeln können, den Mehraufwand für die Erstellung eines framesetter für jede Zeichenfolge, die Sie brauchen, um zu zeichnen. Ist es nicht gerade Ehre Breite-Einschränkungen, aber es scheint, um innerhalb von ein paar Pixel, in meiner Erfahrung.
InformationsquelleAutor der Antwort warrenm
Aus irgendeinem Grund, boundingRectWithSize gibt immer falsche Größe.
Ich fand eine Lösung.
Es ist eine Methode für UItextView -sizeThatFits gibt die richtige Größe für den text festlegen.
Anstatt also mit boundingRectWithSize, erstellen Sie einen UITextView, mit einem zufällig ausgewählten Bild, und rufen Sie seine sizeThatFits mit der jeweiligen Breite und CGFLOAT_MAX Höhe.
Es gibt die Größe, die haben die richtige Höhe.
Wenn Sie die Berechnung der Größe in einer while-Schleife, nicht vergessen, hinzuzufügen, dass in einem autorelease pool, wie es sein wird, n die Anzahl der UITextView erstellt, die run-time-Speicher der app wird zunehmen, wenn wir nicht autoreleasepool verwenden.
InformationsquelleAutor der Antwort shoan
Ed McManus hat durchaus einen Schlüssel zu bekommen, um zu arbeiten. Ich fand, ein Fall, der nicht funktioniert
rect nicht die richtige Höhe. Beachten Sie, dass anotherString (Anhang zur string) wurde initialisiert, ohne ein Attribut-dictionary. Dies ist eine legitime Initialisierung für anotherString aber boundingRectWithSize: nicht geben, eine genaue Größe in diesem Fall.
InformationsquelleAutor der Antwort Paul Heller
Meine endgültige Entscheidung nach langen Ermittlungen:
- boundingRectWithSize
- Funktion gibt die korrekte Größe für die ununterbrochene Abfolge von Zeichen nur!Im Falle Zeichenfolge Leerzeichen enthält, oder etwas anderes (genannt von Apple "Einige der Glyphen" ) - es ist unmöglich, die tatsächliche Größe der rect benötigt zum anzeigen von text!
Habe ich ersetzt Leerzeichen in meine Zeichenfolgen von Buchstaben und bekam sofort richtige Ergebnis.
Apple sagt hier:
https://developer.apple.com/documentation/foundation/nsstring/1524729-boundingrectwithsize
"Diese Methode liefert die tatsächlichen Grenzen der Zeichen in der Zeichenfolge. Einige der Zeichen (Leerzeichen, zum Beispiel) erlaubt sind, überlappen sich die layout-constraints angegeben, die durch die Größe übergeben, so dass in einigen Fällen der Wert für die Breite der Größe Komponente der zurückgegebenen
CGRect
können übersteigt der Wert der Breite der size-parameter."So ist es notwendig, einige finden einen anderen Weg zur Berechnung der tatsächlichen rect...
Nach langen Ermittlungen-Prozess-Lösung endlich gefunden!!!
Ich bin nicht sicher, es funktioniert gut für alle Fälle
UITextView
, aber Haupt-und wichtige Sache erkannt wurde!boundingRectWithSize
- Funktion sowieCTFramesetterSuggestFrameSizeWithConstraints
(und viele andere Methoden) berechnen Sie Größe und text Teil korrigieren, wenn die korrekte Rechteck verwendet.Zum Beispiel -
UITextView
hattextView.bounds.size.width
- und dieser Wert nicht die tatsächliche Rechteck verwendet, die durch das system beim zeichnen von text aufUITextView
.Fand ich sehr interessant, parameter-und einfache Berechnung durchgeführt in code:
And magic funktioniert - alle meine Texte korrekt ausgerechnet jetzt!
Genießen Sie!
InformationsquelleAutor der Antwort Юрий Сталоверов
In Fall, dass Sie möchten, um bounding box durch abschneiden des Schwanzes, diese Frage kann Ihnen helfen.
InformationsquelleAutor der Antwort Roman B.
Habe ich nicht Glück haben, mit diesen Anregungen. Mein string enthaltenen unicode-Kugel Punkte und ich vermute, Sie wurden verursacht Trauer in die Berechnung ein. Ich bemerkte UITextView wurde die Handhabung der Zeichnung fein, so sah ich zu, zu nutzen, seine Berechnung. Ich habe die folgenden, dem ist wohl nicht so optimal wie die NSString-Zeichnung Methoden, aber zumindest ist es korrekt. Es ist auch etwas besser geeignet als Initialisierung einer UITextView einfach anrufen
-sizeThatFits:
.InformationsquelleAutor der Antwort Ricky
@warrenm tut mir Leid zu sagen, dass framesetter Methode hat nicht funktioniert für mich.
Habe ich diese.Diese Funktion kann uns helfen, bestimmen die Größe des Frames benötigt, für einen string, der Auswahl von einem NSAttributedString in iphone - /Ipad-SDK, die für eine gegebene Breite :
Kann es verwendet werden, für die eine dynamische Höhe von UITableView Zellen
Dank HADDAD ISSA >>> http://haddadissa.blogspot.in/2010/09/compute-needed-heigh-for-fixed-width-of.html
InformationsquelleAutor der Antwort Karan Alangat
Stellt sich heraus, dass JEDER Teil von einem NSAttributedString muss ein Wörterbuch mit mindestens NSFontAttributeName und NSForegroundColorAttributeName gesetzt, wenn Sie es wünschen boundingRectWithSize tatsächlich funktioniert!
Ich sehe nicht, dass irgendwo dokumentiert.
InformationsquelleAutor der Antwort Ben Wheeler
Ich hatte das gleiche problem mit nicht immer eine genaue Größe wird mit diesen Techniken und ich habe mich verändert mein Ansatz, es zu schaffen.
Ich habe eine lange zugeschrieben Zeichenfolge, die ich versucht habe, um fit in einem scroll-Ansicht, so dass es zeigt richtig, ohne abgeschnitten zu werden. Was ich getan habe, um den text zuverlässig arbeiten war nicht die Höhe überhaupt als Einschränkung und erlaubte stattdessen die intrinsische Größe zu übernehmen. Nun wird der text korrekt angezeigt, ohne abgeschnitten zu werden und ich habe nicht zu berechnen die Höhe.
Ich nehme an, wenn ich es brauche, um die Höhe zuverlässig würde ich eine Ansicht erstellen, die versteckt ist und diese Einschränkungen und erhalten die Höhe des Rahmens, sobald die Einschränkungen angewendet werden.
InformationsquelleAutor der Antwort Brennan
Habe ich gefunden, dass die bevorzugte Lösung ist nicht in der Lage Zeilenumbrüche.
Habe ich gefunden, diese Methode funktioniert in allen Fällen:
InformationsquelleAutor der Antwort dmc
Funktioniert auf allen Schriftarten perfekt!
InformationsquelleAutor der Antwort Dmitry Coolerov
Im ein wenig spät, um das Spiel - aber ich habe versucht, herauszufinden, einen Weg, der funktioniert, finden Sie den Begrenzungsrahmen passt, um eine zugeschrieben string, um einen Fokus-ring, wie die Bearbeitung einer Datei im Finder funktioniert. alles, was ich versucht hatte, gescheitert, wenn es von Leerzeichen am Ende der Zeichenfolge oder mehrere Leerzeichen innerhalb der Zeichenfolge.
boundingRectWithSize
taugt nicht für diesen, wie auchCTFramesetterCreateWithAttributedString
.Mit einem
NSLayoutManager
folgende code scheint um den trick zu tun, in allen Fällen, die ich bis jetzt gefunden habe und gibt eine rect, perfekt Grenzen der Zeichenfolge. Bonus: wenn Sie den text markieren die Kanten der Auswahl gehen Sie nach rechts bis zu den Grenzen des rect zurück. Der folgende code verwendet den layoutManager von einemNSTextView
.InformationsquelleAutor der Antwort Chris Walken
Swift drei version
Messen Sie den text mit dem CTFramesetter am besten funktioniert, wie es liefert integer-Größen und-Griffe emoji und andere unicode-Zeichen.
InformationsquelleAutor der Antwort David Rees
Ich hatte das gleiche problem, aber ich habe erkannt, dass die Höhe eingeschränkt korrekt eingestellt wurde. Also habe ich Folgendes gemacht:
InformationsquelleAutor der Antwort Marcel
Habe ich versucht, alles auf dieser Seite und hatte immer noch ein Fall für das UILabel, das war nicht die Formatierung korrekt. Eigentlich ist die Einstellung der attributedText auf dem Etikett endlich das problem behoben.
InformationsquelleAutor der Antwort Lil
Eine Sache, die ich bemerkt ist, dass die rect-würde wieder von
(CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context
hätte eine größere Breite als das, was ich übergeben. Wenn dies passiert ist mein string wäre abgeschnitten. Ich beschloss, dass ich es so:Etwas mehr Kontext; ich hatte mit mehreren Zeilen text und ich habe versucht, finden die richtige Höhe, um es anzuzeigen. boundRectWithSize war manchmal Rückgabe einer Breite größer als das, was würde ich geben, damit, wenn ich meine Vergangenheit in der Breite und der berechneten Höhe anzeigen, mein text, würde es abschneiden. Aus testen wenn boundingRectWithSize verwendet die falsche Breite der Betrag, den es machen würde, die Höhe, kurz durch war 1. Zeile. Also ich würde überprüfen, ob die Breite größer war, und wenn ja, fügen Sie die schriftart lineHeight genug Raum, um zu vermeiden abschneiden.
InformationsquelleAutor der Antwort odyth
wenn label Rahmen nicht fügen 10 diese Methode funktioniert nie! hoffe das kann dir helfen! goog Glück.
InformationsquelleAutor der Antwort MICHEAL LV
}
InformationsquelleAutor der Antwort Anny
Ich möchte noch hinzufügen, dass meine Gedanken, da ich genau das gleiche problem hatte.
War ich mit
UITextView
da war es schöner text alignment (ausrichten, die zu der Zeit nicht verfügbar inUILabel
), aber um das zu "simulieren" nicht-interaktive-nicht-scrollbarenUILabel
würde ich ganz abschalten, scrollen, Prellen und Benutzer-Interaktion.Natürlich, problem war, dass der text dynamisch, und während die Breite behoben werden würde, soll die Höhe neu berechnet, jedes mal, wenn ich neue text Wert.
boundingRectWithSize
funktionierte nicht gut für mich aus, was ich sehen konnte,UITextView
war Sie, einige Rand auf der Oberseite, dieboundingRectWithSize
würde nicht in eine Zählung, also die Höhe abgerufenboundingRectWithSize
war kleiner, als es sein sollte.Da text wurde nicht aktualisiert werden, schnell, es ist nur für einige Informationen, die möglicherweise ein update alle 2-3 Sekunden die meisten, habe ich beschlossen, folgenden Ansatz:
*Über code nicht direkt kopiert von meiner Quelle, ich musste es anpassen /löschen von Haufen anderer Sachen, die nicht notwendig für diesen Artikel. Nehmen Sie es nicht für copy-paste-und-es-wird-die-Arbeit-code.
Offensichtliche Nachteil ist, dass es alloc und release, für jeden Anruf.
Aber, der Vorteil ist, dass Sie vermeiden, abhängig von der Kompatibilität zwischen dem, wie boundingRectWithSize zeichnet text und berechnet seine Größe und Implementierung von text-Zeichnung in
UITextView
(oderUILabel
die auch Sie verwenden können, ersetzen Sie einfachUITextView
mitUILabel
). Alle "bugs", dass Apple möglicherweise werden auf diese Weise vermieden.P. S. Es scheint, dass Sie nicht benötigen, sollten Sie diese "temp" -
UITextView
und können einfach FragensizeThatFits
direkt vom Ziel, aber das hat nicht funktioniert für mich. Obwohl die Logik würde sagen, es sollte funktionieren und alloc/release temporäreUITextView
sind nicht erforderlich, es kam nicht. Aber diese Lösung funktionierte einwandfrei für jeden text, den ich einstellen würde.InformationsquelleAutor der Antwort Sinisa
Ok, so verbrachte ich viel Zeit zum Debuggen. Ich fand heraus, dass die maximale Texthöhe definiert durch
boundingRectWithSize
erlaubt, um text anzuzeigen, die durch meineUITextView
war niedriger als die Rahmengröße.In meinem Fall ist der Rahmen bei den meisten 140pt aber der UITextView tolerieren Texte bei den meisten 131pt.
Musste ich herausfinden, dass manuell und fest die "echte" maximale Höhe.
Hier ist meine Lösung:
InformationsquelleAutor der Antwort Antzi