Wie man NSStringDrawingContext text verkleinern?
Ich versuche, die zugeschrieben string-API von iOS 6 so berechnen Sie die Größe von text und verkleinern Sie die Schriftgröße, wenn nötig. Allerdings kann ich es nicht zu funktionieren, wie die Dokumentation sagt.
NSString *string = @"This is a long text that doesn't shrink as it should";
NSStringDrawingContext *context = [NSStringDrawingContext new];
context.minimumScaleFactor = 0.5;
UIFont *font = [UIFont fontWithName:@"SourceSansPro-Bold" size:32.f];
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
paragraphStyle.lineBreakMode = NSLineBreakByClipping;
NSDictionary *attributes = @{ NSFontAttributeName: font,
NSParagraphStyleAttributeName: paragraphStyle };
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:self.title attributes:attributes];
CGRect rect = [attributedString boundingRectWithSize:CGSizeMake(512.f, 512.f) options:NSStringDrawingUsesLineFragmentOrigin context:context];
NSLog(@"rect: %@, context: %@", NSStringFromCGRect(rect), context.debugDescription);
Aber der text nicht verkleinern und abgeschnitten. actualScaleFactor
ist immer 1
. Die log-Ergebnisse:
rect:{{0, 0}, {431.64801, 80.447998}}, context:<NSStringDrawingContext: 0x14e85770> minimumScaleFactor:0.500000 minimumTrackingAdjustment:0.000000 actualScaleFactor:1.000000 actualTrackingAdjustment:0.000000 totalBounds:{{0, 0}, {431.64801, 80.447998}}
Das Ergebnis ist das gleiche, wenn ich mit der eigentlichen Zeichnung-Methode und nicht die Messmethode. Wenn ich Entferne den Absatz-Stil, es macht den text wrap und nicht schrumpfen. Wenn ich Entferne den Absatz-Stil, UND ich wählen Sie eine Größe, die erlaubt nur eine Zeile text, wird der text abgeschnitten zu sein statt geschrumpft. Was ist falsch? Es gibt sehr wenig Dokumentation oder online-Ressourcen, die den Umgang mit NSStringDrawingContext
. Und ich versuche zu vermeiden, die Verwendung von sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
die veraltet ist in iOS 7.
- Ich habe das gleiche problem und kann einfach nicht damit es funktioniert...
- Ich lief in das gleiche problem auf iOS 8. actualScaleFactor nicht aktualisiert wird, ist Kontext verwendet wird, für boundingRectWithSize:Optionen:Attribute::Kontext: oder mit drawWithRect:Optionen:Attribute:context:.
Du musst angemeldet sein, um einen Kommentar abzugeben.
NSStringDrawingContext ist
minimumScaleFactor
gebrochen erscheint iOS 7.So weit wie ich kann machen aus, auch in iOS 6, es hat nicht funktioniert für die Zeichnung; er arbeitete für die Messung, so könnte man herausfinden, was passieren würde, in einem Kontext, wo es hat Arbeit für die Zeichnung, wie ein UILabel. So, Sie wissen, die richtige Mindesthöhe für das label.
Oder, könnten Sie mit den daraus resultierenden Skalierungsfaktor verkleinert den text selbst, in dem wissen, dass es jetzt passt.
Beispiel:
In iOS 6
scale
ist über 0,85 und Sie können es verwenden, wie gezeigt, verkleinert den text. Aber in iOS 7,scale
bleibt bei 1, was darauf hindeutet, dass keine Schrumpfung passiert ist und diese Funktion von NSStringDrawingContext ist jetzt nutzlos. Ich kann nicht sagen, ob das ein bug ist oder ob das feature wurde bewusst aufgegeben.drawWithRect:
, die OP wäre nicht diese Frage zu stellen und wäre ich nicht zu beantworten.Nach googeln für eine lange Zeit habe ich nicht eine Lösung finden, die funktioniert unter iOS7. Ich jetzt verwenden Sie die folgende Problemumgehung, zu wissen, dass es sehr hässlich. Ich render ein UILabel in Erinnerung, einen screenshot machen und zeichnen. UILabel ist in der Lage zu schrumpfen, wird der text korrekt.
Aber hat vielleicht jemand findet es nützlich.
Gerade wollte nach dieser Lösung und ich haben gekämpft, mit diesem für ein paar Stunden. Ich konnte nie den text-Bereich verkleinert werden und würde immer noch die letzten Zeilen von text abgeschnitten.
Die Lösung für mich war, nicht fügen Sie einen Kontext, und nur setzen Sie ihn auf null. Ich habe dies beim Blick auf das Beispiel auf dieser Seite. https://littlebitesofcocoa.com/144-drawing-multiline-strings
Hinweis: nach dem abrufen der Größe der box ziehen würde bei Verwendung
Benötigte ich noch eine Schleife durch das verkleinern der schriftart manuell: