Frage

Ich habe eine lange NSString Ich möchte ein paar Seiten angezeigt werden über.

Aber um dies zu tun, ich brauche, wie vielen Text tatsächlich um herauszufinden, auf der Seite passen.

[NSString sizeWithFont: ...] Ist das nicht genug, wird es mir nur sagen, ob der Text paßt in dem Rechteck oder nicht, wenn sie nicht tut, wird es still die Schnur abschneiden, aber es wird mir nicht sagen, wo es abgeschnitten!

Ich brauche das erste Wort zu wissen, die nicht auf der Seite passen, so dass ich die String aufteilen und dass ein Teil davon auf der nächsten Seite ziehen. (Und Wiederholung)

Alle Ideen, wie diese zu lösen?

Nur Idee, die ich habe mich so weit wiederholt sizeWithFont nennen: constrainedToSize: um den Punkt in der Zeichenfolge, wo ich der Seitenumbruch bin erraten werden, und analysiere die daraus resultierende rect, aber es fühlt sich mühsam und langsam, und ich fühle ich könnte zusätzliche Probleme habe es zu 100% genau ... bekommen (wegen Unterlängen, und so weiter.)

OFC, hat es in der Öffentlichkeit iOS SDK verfügbar sein

Antwort:

Puh, die einige haarige Dokumentation war. Hier ist meine fertige Funktion als ein Beispiel, wird es vielleicht jemanden helfen, da es nicht viele iphone spezifischen Kerntext Beispiele da draußen ist.

+ (NSArray*) findPageSplits:(NSString*)string size:(CGSize)size font:(UIFont*)font;
{
  NSMutableArray* result = [[NSMutableArray alloc] initWithCapacity:32];
  CTFontRef fnt = CTFontCreateWithName((CFStringRef)font.fontName, font.pointSize,NULL);
  CFAttributedStringRef str = CFAttributedStringCreate(kCFAllocatorDefault, 
                                                       (CFStringRef)string, 
                                                       (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:(id)fnt,kCTFontAttributeName,nil]);
  CTFramesetterRef fs = CTFramesetterCreateWithAttributedString(str);
  CFRange r = {0,0};
  CFRange res = {0,0};
  NSInteger str_len = [string length];
  do {
    CTFramesetterSuggestFrameSizeWithConstraints(fs,r, NULL, size, &res);
    r.location += res.length;
    [result addObject:[NSNumber numberWithInt:res.length]];
  } while(r.location < str_len);
//  NSLog(@"%@",result);
  CFRelease(fs);
  CFRelease(str);
  CFRelease(fnt);
  return result;
}  

Wichtiger Hinweis:

Sie können nicht den zurückgegebenen Bereich oder Größe mit beliebigen UIKit Klassen oder String-Zeichenfunktionen nutzen! Sie müssen es nur mit Core Text, zum Beispiel verwenden, um eine CTFrame zu schaffen und diese Zeichnung. Feine Unterschiede in Dinge wie Kerning macht es unmöglich, Kerntextfunktionen mit UIKit zu kombinieren.

Beachten Sie auch, dass die zurückgegebene Größe Buggy sein gefunden wurde.

War es hilfreich?

Lösung

Sie sollten schauen Sie in Core, verfügbar seit iOS 3.2. Die Dokumente sind ziemlich kompliziert und kann hier gefunden werden: . Grundsätzlich Sie eine CTFramesetter und Call CTFramesetterSuggestFrameSizeWithConstraints erstellen. Sie werden dann den Bereich des Textes, paßt innerhalb eines gegebenen CGSize finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top