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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top