Como dividir longos nsstring em páginas
Pergunta
Eu tenho uma longa nsstring que quero exibir em algumas páginas.
Mas, para fazer isso, preciso descobrir quanto texto realmente se encaixará na página.
NSString SizewithFont: ...] não é suficiente, ele apenas me dirá se o texto se encaixa no retângulo ou não, se não for, ele truncará silenciosamente a corda, mas não me dirá onde truncou!
Preciso saber a primeira palavra que não se encaixa na página, para que eu possa dividir a string e desenhar essa parte dela na próxima página. (e repita)
Alguma idéia de como resolver isso?
A única ideia que eu tenho até agora é chamar repetidamente de tamanhowithfont: forreioressize: em torno do ponto na string em que estou achendo Problemas adicionais para obter 100% precisos ... (por causa de descendentes e outros enfeites)
OFC, tem que estar disponível no público IOS SDK
Responda:
Ufa, essa foi uma documentação peluda. Aqui está minha função final como exemplo, talvez ajude alguém, pois não há muitos exemplos de texto central específicos para iPhone por aí.
+ (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:
Você não pode usar o intervalo ou tamanho retornado com as classes Uikit ou funções de desenho de string! Você deve usá -lo apenas com o texto do núcleo, por exemplo, criando um CTFRame e desenhando isso. Diferenças sutis em coisas como Kerning tornam impossível combinar funções principais de texto com o UIKIT.
Além disso, observe que o tamanho retornado foi considerado um buggy.
Solução
Você deve procurar no Coretext, disponível desde o iOS 3.2. Os documentos são bastante complicados e podem ser encontrados aqui. Basicamente, você cria um CTFrameSetter e chama CtframeSetterGergEstFramesizewithConstraints. Você encontrará o intervalo de texto que se encaixa em um determinado CGSize.