我有一个很长的 NSString,我想在几页上显示。
但要做到这一点,我需要找出页面上实际适合的文本量。
[NSString sizeWithFont: ...] 还不够,它只会告诉我文本是否适合矩形,如果不适合,它会默默地截断字符串,但不会告诉我在哪里它被截断了!
我需要知道第一个不适合页面的单词,这样我就可以分割字符串并将其部分绘制在下一页上。 (并重复)
有什么想法可以解决这个问题吗?
到目前为止,我自己唯一的想法是在字符串中我猜测分页符所在的点周围重复调用 sizeWithFont:constrainedToSize: ,并分析生成的矩形,但感觉很麻烦且缓慢,我觉得我可能会遇到其他问题,使其 100% 准确...(因为下降部分等等。)
ofc,它必须在公共(public) 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 类或字符串绘制函数一起使用!您只能将其与 Core Text 一起使用,例如创建 CTFrame 并绘制它。 诸如字距调整之类的细微差别使得 Core Text 功能与 UIKit 的结合变得不可能。
另外,请注意,返回的大小已被发现有错误。
最佳答案
您应该查看 CoreText,它自 iOS 3.2 起可用。文档相当复杂,可以找到here 。基本上,您创建一个 CTFramesetter 并调用 CTFramesetterSuggestFrameSizeWithConstraints。然后,您将找到适合给定 CGSize 的文本范围。
关于iphone - 如何将长 NSString 拆分为页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3812692/