如何分割长的NSString到页面
题
我有一个长的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内配合。
不隶属于 StackOverflow