Olo*_*man 12 iphone nsstring core-text
我有一个很长的NSString我想在几页上显示.
但要做到这一点,我需要找出页面上实际适合的文本数量.
[NSString sizeWithFont:...]是不够的,它只会告诉我文本是否适合矩形,如果没有,它会默默地截断字符串,但它不会告诉我它被截断的位置!
我需要知道第一个不适合页面的单词,所以我可以分割字符串并在下一页上绘制它的那一部分.(并重复)
任何想法如何解决这个问题?
到目前为止我唯一的想法就是重复调用sizeWithFont:constrainedToSize:在字符串中我猜测分页符的位置,并分析得到的矩形,但感觉很麻烦和缓慢,我觉得我可能有使其100%准确的其他问题...(因为下降,等等.)
ofc,它必须在公共iOS SDK中可用
回答:
Phew,这是一些毛茸茸的文件.这是我完成的功能作为一个例子,也许它会帮助某人,因为那里没有太多特定于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;
}
Run Code Online (Sandbox Code Playgroud)
重要的提示:
您不能将返回的范围或大小与任何UIKit类或字符串绘制函数一起使用!您只能将它与Core Text一起使用,例如创建CTFrame并绘制它.像字距调整这样的细微差别使得无法将Core Text函数与UIKit结合起来.
另请注意,已发现返回的大小有问题.
您应该研究一下 CoreText,它自 iOS 3.2 起可用。这些文档相当复杂,可以在这里找到。基本上,您创建一个 CTFramesetter 并调用 CTFramesetterSuggestFrameSizeWithConstraints。然后,您将找到适合给定 CGSize 的文本范围。
归档时间: |
|
查看次数: |
3127 次 |
最近记录: |