如何从CGSIZE获取UITextView的NSAttributedString?

17

我正在使用UITextViewNSAttributedString创建一款阅读应用程序,我需要将整个属性字符串拆分成较小数量的属性字符串,以实现分页概念。

我有一个计算给定属性字符串框架大小的方法。

        CGRect rect = [attrString boundingRectWithSize:CGSizeMake(768, 10000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];

但我需要获取 (768, 1024) ContentSize 的 attributeString。

我已经使用了这个方法,但是 attributedStrings 没有正确地分割,因为它包含了 NSTextAttachmentHTML 字符串。

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)delegate.attributedString);

我该如何计算这个?计算需要快速且占用内存较小。

3个回答

7
如果您想知道一个 UITextView 的尺寸,不应该询问文本的边框,因为它不是视图的大小。 UITextView 包含填充区域,您需要考虑到这一点。
最好和更简单的方法是,在添加文本后立即调用 sizeToFit 来调整文本视图的大小。稍后只需请求 UItextView 的帧。

其实我有一个包含了带属性的文本、HTML表格和NSTextAttachment的较大文本。我想把这个文本分成多个小文本(适合768X1024框架大小),那么如何分割这段文本呢? - Manimaran
我认为你应该更新你的问题标题。我从未有机会处理类似的问题。也许你需要深入研究CoreText,或者如果你部署的是iOS7或更高版本,尝试使用TextKit和NSLayoutManager,这里是一个起点http://www.objc.io/issue-5/getting-to-know-textkit.html 。使用大小限制的边界矩形将始终给出文本视图大小的近似评估。 - Andrea
我已经更改了我的标题。在您提供的链接中,他们没有解决我的问题。 - Manimaran

2

您可以使用UITextView函数sizeThatFits:

来调整大小。

[textView sizeThatFits:CGSizeMake(768, 1024)]

2
如果您想在“页面”之间拆分文本,则需要使用NSLayoutManagerNSTextContainer类的功能。基本上,您需要为要显示的每个页面创建一个NSTextContainer实例,使用initWithSize:初始化程序。然后,您可以使用-[NSLayoutManager addTextContainer:]注册这些容器。
以下是相关文档:https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html#//apple_ref/doc/uid/TP40009542-CH4-SW35

我已经尝试过这个,它需要非常长的时间,同时也会增加内存的使用量。因为我的文档非常大。 - Manimaran
那么我猜你只能在使用CoreText API的同时,以某种方式补偿附件。或者,根据你想要呈现UI的方式,你需要使用懒惰算法并重用现有视图。 - Dalzhim
我正在重复使用现有的视图(UITextView),并且我有来自长文档的NSAttributedString。它包含图片(NSTextAttachmentHTML表)。目前我正在使用CTFramesetterCreateWithAttributedString将attributedString分成多个大小为768X1024的页面,但它不能给出精确的输出(会产生更多的空白和裁剪文本)。 - Manimaran
CoreText 不处理诸如 BaselineOffset、附件和 LinkAttributes 等属性。如果你已经配置了 UITextView 以具有链接的特定属性字典,则需要将这些属性插入到使用 CoreText 评估的 attributedString 中,否则测量结果可能会有所不同。 - Dalzhim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接