NSAttributedString + Height for Width

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSAttributedString + Height for Width

    Hallo,

    ich habe hier einen NSAttributedString. Nun möchte ich folgendes wissen: Wie "hoch" wird der String, falls ich ihn mit einer Breite von z.B. 100 Points auf ein View zeichne?

    size liefert nur die "Größe" des Strings die er benötigen würde, falls man ihn "als Einzeiler" mit drawAtPoint: zeichnet.

    boundingRectWithSize:options: ist auch nicht das richtige. Übergebe ich der Methode ein NSSize mit 100x100 Points so ist die Größe des boundingRects natürlich auch nur max. 100x100.

    Anders formuliert: Ich möchte wissen, wie "hoch" der String bei entsprechender "Breite" wird. Momentan behelfe ich mir damit, dass ich boundingRectWithSize:options: ein NSSize mit NSNotFound ( = eine sehr hohe Zahl) für die Höhe und einen bestimmten Wert für die Breite übergebe.

    Aber ist das wirklich das absolut beste?
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • RE: NSAttributedString + Height for Width

    Original von Objcler
    Anders formuliert: Ich möchte wissen, wie "hoch" der String bei entsprechender "Breite" wird. Momentan behelfe ich mir damit, dass ich boundingRectWithSize:options: ein NSSize mit NSNotFound ( = eine sehr hohe Zahl) für die Höhe und einen bestimmten Wert für die Breite übergebe.
    Äh, NSNotFound ist nicht zwingend eine sehr hohe Zahl. Das ist ein Zufall (könnte nämlich auch als -1 definiert sein). Du kannst auch PATH_MAX oder (1<<31) nehmen. Das ist semantisch genauso falsch.

    Was Du brauchst ist eine sehr hohe Koordinate! Nehme NSMakeSize(100.0, 99999.123454321);

    Da Koordinaten in pt (1/72 Zoll) angegeben sind ist Deine size damit einfach eine Box die 35,2774 Meter hoch ist. So groß wird Dein Text kaum jemals werden...

    Aber genau für den beschriebenen Zweck ist die Methode boundingRectWithSize:options eingeführt worden. Herausfinden wieviel Platz ein Text in einem vorgegebenen Rahmen braucht. Und wenn der Rahmen genügend Luft läßt...

    -- hns
  • RE: NSAttributedString + Height for Width

    Original von hns
    Äh, NSNotFound ist nicht zwingend eine sehr hohe Zahl. Das ist ein Zufall (könnte nämlich auch als -1 definiert sein). Du kannst auch PATH_MAX oder (1<<31) nehmen. Das ist semantisch genauso falsch.


    Ich meinte natürlich nicht NSNotFound sondern FLT_MAX. Kleines Versehen.

    Aber genau für den beschriebenen Zweck ist die Methode boundingRectWithSize:options eingeführt worden. Herausfinden wieviel Platz ein Text in einem vorgegebenen Rahmen braucht. Und wenn der Rahmen genügend Luft läßt...


    Welche Beschreibung meinst du jetzt? Meine oder die der Doku? boundingRectWithSize:options funktioniert ja (falls ich das alles richtig verstehe wie folgt):

    Angenommen der size-Parameter ist 100x100. Der zu zeichnende String würde bei dieser Größe aber bzgl. der Höhe größer sein als 100. boundingRectWithSize:options liefert (dennoch) ein Rect der Form: (0, 0, 100, 100). Die Größe des boundingRects wird folglich nie größer als der übergebene size-Parameter. Ist ja auch logisch. Die Methode heißt schließlich "boundingRect" und nicht "frameRect" oder ä.

    Um meine Frage nun nochmals zu verdeutlichen: Ich suche eine Methode mit der ich das selbe "erreiche" wie mit dem FLT_MAX Ansatz - allerdings eben ohne diesen "Hack". Falls es da keine gibt bin ich zufrieden und nutze weiterhin "meine" Lösung.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Original von Objcler
    Dort wird auch der FLT_MAX Ansatz genutzt - allerdings wird dort der Layout-Manager direkt genutzt.
    Anscheinend. Warum meinst Du überhaupt dass der bisherige Ansatz ein Hack ist?

    Es sind alles ganz offizielle Methoden die genau das machen was Du willst. Ohne Umweg. Nur das mit dem FLT_MAX, aber genau das ist richtig. Text gegebener Breite in eine Box mit sehr großer Länge zu schreiben und dann die benötigte Höhe auszugeben.

    Ich finde Du darfst zufrieden sein. Was gibt es noch Einfachers als genau eine Methode mit den richtigen Parametern aufzrufen...

    -- hns
  • Original von hns
    Original von Objcler
    Dort wird auch der FLT_MAX Ansatz genutzt - allerdings wird dort der Layout-Manager direkt genutzt.
    Anscheinend. Warum meinst Du überhaupt dass der bisherige Ansatz ein Hack ist?

    Es sind alles ganz offizielle Methoden die genau das machen was Du willst. Ohne Umweg. Nur das mit dem FLT_MAX, aber genau das ist richtig. Text gegebener Breite in eine Box mit sehr großer Länge zu schreiben und dann die benötigte Höhe auszugeben.

    Ich finde Du darfst zufrieden sein. Was gibt es noch Einfachers als genau eine Methode mit den richtigen Parametern aufzrufen...

    -- hns


    "Hack" war und ist das falsche Wort aber eine Methode, die keine oder weniger Parameter benötigt als eine alternative Methode ist einfacher als eben diese.

    Ich habe nun gelernt, dass:

    * es keine Methode mit weniger Parametern gibt
    * dass boundingRect bzw. das NSLayoutManager Beispiel von Apple die Aufgabe lösen

    Ist doch wunderbar. Genau das wollte ich erfahren. Mir ist schon klar, dass ein Framework nicht komplett und universell zugleich sein kann. Beim Entwickeln eines Frameworks muss manchmal auf eine Methode verzichtet werden, die einzelne gerne haben würden. Aber das ist ja nicht schlimm und ich beschwere mich nicht. FLT_MAX hat mich ein wenig irritiert, da ich darauf bei anderen Frameworks eben nicht zurückgreifen muss.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Wenn mir manchmal so etwas nicht schmeckt, ich kann dich da schon verstehen, dann packe ich eine entsprechende Methode, wie ich sie erwartet habe, in eine Kategorie und setze in dieser dann eben einfach die Höhe auf FLT_MAX.

    Habe ich das fertig, hole ich mir ne Flasche Vodka und litere die. Am nächsten Morgen weiß ich von der Kategorie nichts mehr und das Unwohlsein ist weg.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Tom9811
    Habe ich das fertig, hole ich mir ne Flasche Vodka und litere die. Am nächsten Morgen weiß ich von der Kategorie nichts mehr und das Unwohlsein ist weg.

    Deine pragmatischen Ansätze gefallen mir!
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • Original von seb2
    Original von Tom9811
    Habe ich das fertig, hole ich mir ne Flasche Vodka und litere die. Am nächsten Morgen weiß ich von der Kategorie nichts mehr und das Unwohlsein ist weg.

    Deine pragmatischen Ansätze gefallen mir!

    Ich hoffe nur Tom vermisst nicht zu viele Methoden und schafft dann mit diesem Ansatz Abhilfe, sonst könnte der Vodka Konsum aus Dauer immens ausfallen. :D
  • Original von Tom9811
    Wenn mir manchmal so etwas nicht schmeckt, ich kann dich da schon verstehen, dann packe ich eine entsprechende Methode, wie ich sie erwartet habe, in eine Kategorie und setze in dieser dann eben einfach die Höhe auf FLT_MAX.

    Habe ich das fertig, hole ich mir ne Flasche Vodka und litere die. Am nächsten Morgen weiß ich von der Kategorie nichts mehr und das Unwohlsein ist weg.


    Ich habe das jetzt ja schon seit Stunden in eine Katgorie gepackt und bin glücklich damit. :) Ich wollte nur sichergehen, dass ich da nichts unnötiges mache.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Original von MCDan
    Original von seb2
    Original von Tom9811
    Habe ich das fertig, hole ich mir ne Flasche Vodka und litere die. Am nächsten Morgen weiß ich von der Kategorie nichts mehr und das Unwohlsein ist weg.

    Deine pragmatischen Ansätze gefallen mir!

    Ich hoffe nur Tom vermisst nicht zu viele Methoden und schafft dann mit diesem Ansatz Abhilfe, sonst könnte der Vodka Konsum aus Dauer immens ausfallen. :D

    Welche Methoden?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?