Pregunta

Tengo una larga NSString Quiero mostrar más de un par de páginas.

Pero para hacer esto, necesito averiguar la cantidad de texto se ajuste realmente en la página.

[NSString sizeWithFont: ...] no es suficiente, se me acaba de decir si los ataques de texto en el rectángulo o no, si su no hace, será en silencio truncar la cadena, pero no me va a decir dónde se trunca!

necesito saber la primera palabra que no cabe en la página, por lo que puede dividir la cadena y extraer la parte del mismo en la página siguiente. (Y repetición)

Alguna idea de cómo solucionar esto?

Sólo idea que tengo yo hasta ahora es llamar repetidamente sizeWithFont: constrainedToSize: alrededor del punto de la cadena en la que estoy adivinando el salto de página será, y analizar el rect resultante, pero se siente incómodo y lento y me siento podría tener problemas adicionales conseguir que el 100% exacto ... (debido a los descendentes, y otras cosas.)

OFC, tiene que estar disponible en el SDK de iOS público

Respuesta:

Uf, que era parte de la documentación cabelludo. Aquí está mi función terminado como un ejemplo, tal vez va a ayudar a alguien, ya que no hay ejemplos de texto núcleo iphone específicos cosas por ahí.

+ (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:

No se puede utilizar la gama devueltos o con cualquier tamaño de clases UIKit o funciones de dibujo de cuerda! Sólo se debe utilizar con Core texto, por ejemplo, la creación de un dibujo y CTFrame eso. diferencias sutiles en cosas como el ajuste entre caracteres hace que sea imposible de combinar las funciones básicas de texto con UIKit.

Además, nota que el tamaño devuelto se ha encontrado para ser defectuoso.

¿Fue útil?

Solución

Usted debe mirar en CoreText, disponible desde IOS 3.2. Los documentos son bastante complicados y se pueden encontrar aquí . Básicamente se crea un CTFramesetter y CTFramesetterSuggestFrameSizeWithConstraints de llamadas. A continuación, encontrar el rango de texto que se ajusta dentro de un determinado CGSize.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top