Come dividere lungo NSString in pagine
Domanda
Ho una lunga NSString Voglio visualizzare più di un paio di pagine.
Ma per fare questo, ho bisogno di scoprire quanto il testo effettivamente rientrano nella pagina.
[NSString sizeWithFont: ...] non è sufficiente, sarà solo dirmi se le crisi di testo nel rettangolo o meno, se non lo fa, sarà in silenzio troncare la stringa, ma non mi dirà dove è troncato!
ho bisogno di sapere la prima parola che non rientra nella pagina, in modo da poter dividere la stringa e disegnare quella parte di essa nella pagina successiva. (E ripetere)
Tutte le idee come risolvere questo?
Solo idea io stesso ho finora è quello di chiamare ripetutamente sizeWithFont: constrainedToSize: intorno al punto nella stringa in cui sto cercando di indovinare l'interruzione di pagina sarà, e analizzare il rect risultante, ma ci si sente ingombrante e lento e mi sento potrei avere ulteriori problemi ottenerlo accurato al 100% ... (a causa dei discendenti, e quant'altro).
ofc, deve essere disponibile in pubblico iOS SDK
Risposta:
Uff, che era un po 'di documentazione peloso. Qui è la mia funzione finito come un esempio, forse sarà aiutare qualcuno, dal momento che non c'è molto iphone-specifici esempi di testo di base là fuori.
+ (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;
}
Nota importante:
Non è possibile utilizzare la gamma restituita o dimensioni, con tutte le classi UIKit o funzioni di disegno di stringa! È necessario utilizzare solo con processori Core testo, ad esempio la creazione di un CTFrame e di disegno che. sottili differenze di cose come la crenatura rende impossibile combinare le funzioni di testo principale con UIKit.
Si noti inoltre che la dimensione restituita è stato trovato per essere buggy.
Soluzione
Si dovrebbe guardare in CoreText, disponibile dal momento che iOS 3.2. I documenti sono piuttosto complicate e possono essere trovati qui . In sostanza si crea un CTFramesetter e CTFramesetterSuggestFrameSizeWithConstraints di chiamata. Sarà quindi trovare la gamma di testo che si inserisce all'interno di un determinato CGSize.