Вопрос

У меня длинный Nsstring, который я хочу показать на пару страниц.

Но чтобы сделать это, мне нужно узнать, сколько текста на самом деле будет соответствовать на странице.

NSSTRING SIZEWITHFONT: ...] недостаточно, он просто скажет мне, если текст подходит в прямоугольник или нет, если его нет, он не будет молча обрезать строку, но она не скажет мне, где это усечено!

Мне нужно знать первое слово, которое не подходит на странице, поэтому я могу разделить строку и нарисовать эту часть ее на следующей странице. (и повторить)

Любые идеи, как это решить?

Только идея, которую я имею в себе до сих пор - это неоднократно звонить в SizeWithFont: ConstrineTotosize: вокруг точки в строке, где я предполагаю, что нарушение страницы будет, и проанализировать результаты прямого, но чувствует себя громоздким и медленно, и я чувствую, что может иметь Дополнительные проблемы, получающие его на 100% точны ... (из-за поклонников и othoutnot.)

OFC, он должен быть доступен в публичном IOS SDK

Отвечать:

Ф.Е., это была какая-то волосатая документация. Вот моя законченная функция в качестве примера, может быть, это поможет кому-то, поскольку там не так много, специфичных для 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;
}  

ВАЖНАЯ ЗАМЕТКА:

Вы не можете использовать возвращенный диапазон или размер с любыми классами Uikit или функции рисования строки! Вы должны использовать его только с помощью сердечного текста, например, создание CTFrame и рисуя это. Тонкие различия в таких вещах, как Kerning, не смогут объединить основные текстовые функции с Uikit.

Кроме того, обратите внимание, что возвращенный размер был обнаружен багги.

Это было полезно?

Решение

Вы должны посмотреть в CORETEXT, доступный с iOS 3.2. Документы довольно сложные и могут быть найдены здесь. Отказ По сути, вы создаете CTFraseTter и вызовите CTFraseEttersuggestframesizeWithConstraints. Затем вы найдете диапазон текста, который соответствует данным CGSIZE.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top