2010-09-28 12 views
11

Ho una lunga NSString Voglio visualizzare più di un paio di pagine.Come dividere lungo NSString in pagine

Ma per fare questo, ho bisogno di scoprire quanto testo si adatta effettivamente alla pagina.

[NSString sizeWithFont: ...] non è sufficiente, sarà solo dirmi se il testo si inserisce nel rettangolo o no, 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, quindi posso dividere la stringa e disegnare quella parte di essa nella pagina successiva. (e ripetere)

Qualche idea su come risolvere questo problema?

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 rettangolo risultante, ma ci si sente ingombrante e lento e ho (. a causa di discendenti, e quant'altro) sento che potrei avere problemi aggiuntivi ottenerlo accurato al 100% ...

OFC, deve essere disponibile in pubblico iOS SDK

risposta:

Phew, quella era una documentazione pelosa. Ecco la mia funzione finita come esempio, forse aiuterà qualcuno, dal momento che non ci sono molti esempi di testo di base specifici per iPhone.

+ (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 stringa! Devi solo usarlo con il Core Text, ad esempio creando un CTFrame e disegnandolo. Piccole differenze in termini di crenatura rendono impossibile combinare le funzioni di Core Text con UIKit.

Inoltre, si noti che la dimensione restituita è stata trovata difettosa.

risposta

3

Si dovrebbe cercare in CoreText, disponibile da iOS 3.2. I documenti sono piuttosto complicati e possono essere trovati here. Fondamentalmente si crea un CTFramesetter e si chiama CTFramesetterSuggestFrameSizeWithConstraints. Troverai quindi la gamma di testo che rientra in un determinato CGSize.

+0

Grazie! sembra davvero essere quello che stavo cercando. Ho trovato i documenti di CoreText, ma non ho visto il CTFramesetterSuggest ... E mi sono confuso sulla relazione tra NSString e CFAttributetStringRef. Al momento ho una soluzione attiva con sizeWithFont, ma sicuramente cercherò di passare a CoreText in seguito –

+0

Ci sono alcune ulteriori informazioni disponibili qui: http://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/ TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html # // apple_ref/doc/uid/TP40009542-CH4-SW1 –

+0

Ricordare che ogni nsstring * è uguale a cfstringref (senza pedaggio a pagamento). –