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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top