Tengo un NSString largo que quiero mostrar en un par de páginas.Cómo dividir NSString largo en páginas
Pero para hacer esto, necesito saber cuánto texto encajará realmente en la página.
[NSString sizeWithFont: ...] No es suficiente, solo me dirá si el texto encaja en el rectángulo o no, si no lo hace, truncará silenciosamente la cadena, pero no me dirá donde se truncó!
Necesito saber la primera palabra que no cabe en la página, por lo que puedo dividir la cadena y dibujar esa parte de ella en la página siguiente. (y repite)
Alguna idea de cómo resolver esto?
La única idea que tengo hasta ahora es llamar repetidamente a sizeWithFont: constrainedToSize: alrededor del punto en la cadena donde supongo que será el salto de página, y analizar el rect resultante, pero se siente complicado y lento y (., debido a los descendentes, y otras cosas) siento que podría tener problemas adicionales que consiguen es fiable al 100% ...
OFC, tiene que estar disponible en el SDK de iOS pública
respuesta:
Phew, esa fue una documentación peluda. Aquí está mi función terminada como ejemplo, quizás ayude a alguien, ya que no hay muchos ejemplos de texto básico específicos del 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:
No se puede utilizar la gama devueltos o con cualquier tamaño de clases UIKit o funciones de dibujo de cadena! Solo debe usarlo con Core Text, por ejemplo, crear un CTFrame y dibujar eso. Las sutiles diferencias en cosas como el kerning hacen que sea imposible combinar funciones de texto principal con UIKit.
Además, tenga en cuenta que se ha encontrado que el tamaño devuelto tiene errores.
Gracias! de hecho, parece ser lo que estaba buscando. Encontré los documentos de CoreText, pero no vi el CTFramesetterSuggest ... Y me confundí sobre la relación entre NSString y CFAttributetStringRef. Por el momento tengo una solución de trabajo con sizeWithFont, pero definitivamente voy a buscar cambiar a CoreText más tarde –
. Hay más información disponible aquí: http://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/ TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html # // apple_ref/doc/uid/TP40009542-CH4-SW1 –
tenga en cuenta que cada nsstring * es igual que cfstringref (puente libre de cargo). –