我有一个长的NSString我想显示在几页。

但要做到这一点,我需要找出多少文本实际上适合在页面上。

[NSString的sizeWithFont:...]是不够的,它只是告诉我,如果在矩形或不是文本的配合,如果没有,它会悄悄地截断字符串,但它不会告诉我在哪里它截断!

我需要知道,不适合在页面上的第一个字,所以我可以分割字符串,并描绘出它的一部分的下一个页面上。 (和重复)

任何想法如何解决此问题?

唯一的想法我自己至今是重复调用sizeWithFont:constrainedToSize:各地在那里我猜分页会,并分析产生的RECT字符串中的点,但感觉笨重,行动迟缓,我觉得我可能有更多的问题得到它准确... 100%(因为伸,和诸如此类的东西。)

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和绘图。 等东西字距细微的差别使得它不可能与UIKit的核心文本的功能结合起来。

此外,请注意,返回大小已被发现是手推车。

有帮助吗?

解决方案

您应该考虑CoreText,可用自iOS 3.2。该文档是相当复杂的,并且可以发现这里。基本上你创建一个CTFramesetter和呼叫CTFramesetterSuggestFrameSizeWithConstraints。这时你会发现文本的范围内给定CGSize内配合。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top