Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何将长字符串拆分为页面_Iphone_Nsstring_Core Text - Fatal编程技术网

Iphone 如何将长字符串拆分为页面

Iphone 如何将长字符串拆分为页面,iphone,nsstring,core-text,Iphone,Nsstring,Core Text,我有一个很长的NSString,我想在几页上显示它 但要做到这一点,我需要找出多少文本将实际适合在页面上 [NSString sizeWithFont:…]还不够,它只会告诉我文本是否适合矩形,如果不适合,它会自动截断字符串,但不会告诉我截断的位置 我需要知道第一个不适合在页面上的单词,这样我可以拆分字符串并在下一页上绘制该部分。(重复) 有什么办法解决这个问题吗 到目前为止,我唯一的想法是反复调用sizeWithFont:constrainedToSize:在字符串中我猜测分页符的位置附近,并

我有一个很长的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;
}  
+(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中是这样,请看这里:当我只想拆分页面,不需要在一个页面中布局超过一个框架时,我可以忽略返回的大小,这样看起来效果很好。