Iphone 如何将长字符串拆分为页面
我有一个很长的NSString,我想在几页上显示它 但要做到这一点,我需要找出多少文本将实际适合在页面上 [NSString sizeWithFont:…]还不够,它只会告诉我文本是否适合矩形,如果不适合,它会自动截断字符串,但不会告诉我截断的位置 我需要知道第一个不适合在页面上的单词,这样我可以拆分字符串并在下一页上绘制该部分。(重复) 有什么办法解决这个问题吗 到目前为止,我唯一的想法是反复调用sizeWithFont:constrainedToSize:在字符串中我猜测分页符的位置附近,并分析生成的rect,但这感觉既麻烦又缓慢,而且我觉得在获得100%的准确度时可能会遇到额外的问题。。。(因为后代,等等。) ofc,它必须在公共iOS SDK中可用 回答: 唷,那是一些毛茸茸的文件。这里是我完成的函数的一个例子,也许它会帮助一些人,因为没有太多iphone特定的核心文本示例Iphone 如何将长字符串拆分为页面,iphone,nsstring,core-text,Iphone,Nsstring,Core Text,我有一个很长的NSString,我想在几页上显示它 但要做到这一点,我需要找出多少文本将实际适合在页面上 [NSString sizeWithFont:…]还不够,它只会告诉我文本是否适合矩形,如果不适合,它会自动截断字符串,但不会告诉我截断的位置 我需要知道第一个不适合在页面上的单词,这样我可以拆分字符串并在下一页上绘制该部分。(重复) 有什么办法解决这个问题吗 到目前为止,我唯一的想法是反复调用sizeWithFont:constrainedToSize:在字符串中我猜测分页符的位置附近,并
+ (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;
}
+(NSArray*)findPageSplits:(NSString*)字符串大小:(CGSize)大小字体:(UIFont*)字体;
{
NSMutableArray*结果=[[NSMutableArray alloc]initWithCapacity:32];
CTFontRef fnt=CTFontCreateWithName((CFStringRef)font.fontName,font.pointSize,NULL);
CFAttributedStringRef str=CFAttributedStringCreate(kCFAllocatorDefault,
(CFStringRef)字符串,
(CFDictionaryRef)[NSDictionary DictionaryWithObjectsSandKeys:(id)fnt,kCTFontAttributeName,nil]);
CTFramesetterRef fs=CTFramesetterCreateWithAttributedString(str);
cfr={0,0};
CFRange res={0,0};
NSInteger str_len=[字符串长度];
做{
CTFramesetterSuggestFrameSizeWithConstraints(fs、r、NULL、size和res);
r、 位置+=分辨率长度;
[结果添加对象:[NSNumber numberWithInt:res.length]];
}而(r.location
重要提示:
您不能将返回的范围或大小用于任何UIKit类或字符串绘图函数!您只能将其与核心文本一起使用,例如,创建CTFrame并绘制它。
内核等方面的细微差异使得核心文本函数无法与UIKit相结合
另外,请注意,已发现返回的大小有问题。您应该查看从iOS 3.2开始提供的CoreText。这些文件相当复杂,可以找到。基本上,您可以创建一个CTFramesetter并调用CTFramesetterSuggestFrameSizeWithConstraints。然后,您将找到适合给定CGSize的文本范围。谢谢!这确实是我一直在寻找的。我找到了CoreText文档,但没有看到CTFramesetterSuggest。。。我对NSString和CFAttributetStringRef之间的关系感到困惑。目前,我有一个sizeWithFont的有效解决方案,但我以后肯定会考虑更改为CoreText。这里有更多信息:请记住,每个nsstring*都与cfstringref(免费桥接)相同。CTFramesetterSuggestFrameSizeWithConstraints似乎有问题,至少在iOS 3.2中是这样,请看这里:当我只想拆分页面,不需要在一个页面中布局超过一个框架时,我可以忽略返回的大小,这样看起来效果很好。