2015-04-15 100 views
18

我正在創建一個使用UITextViewNSAttributedString的讀卡器應用程序,我需要將整個歸屬字符串拆分爲更少量的歸因字符串以啓用頁面概念。如何從CGSIZE爲UITextView獲取NSAttributedString?

我有計算給定屬性字符串的幀大小的方法。

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

但我需要爲(768,1024)ContentSize獲取attributeString。

我已經使用過這個功能,但歸屬的String沒有正確劃分,因爲它包含NSTextAttachmentHTML蜇傷。

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

我該如何計算?它需要快速並需要佔用少量內存。

回答

7

如果您想知道UITextView的大小,您不應該詢問文本的邊界矩形,因爲它不是視圖的大小。 UITextView包含填充,你需要考慮到這一點。
最好最簡單的方法是在添加文本之後立即在文本視圖上調用sizeToFit。稍後請求UItextView框架。

+0

其實我有一個屬性文本,HTML表格和NSTextAttachment更大的文本。我想將文本分成多個小文本(適合768X1024幀大小),那麼如何分割文本? – Manimaran

+0

我認爲你應該更新你的問題的標題。我從來沒有機會處理類似的問題。可能你必須深入研究CoreText,或者如果部署> = iOS7,請嘗試使用TextKit和NSLayoutManager,這裏是一個起點http://www.objc.io/issue-5/getting-to-know-textkit.html。包含大小的邊界矩形將始終給出對文本視圖大小的近似評估。 – Andrea

+0

我改變了我的標題。在你給的鏈接他們沒有處理我的問題 – Manimaran

2

可以使用UITextView的功能sizeThatFits:

[textView sizeThatFits:CGSizeMake(768, 1024)] 
2

如果你想«頁»之間分割文字,那麼你需要使用NSLayoutManager的能力和NSTextContainer類。基本上,您需要使用initWithSize:初始值設定項爲您希望顯示的每個頁面創建一個NSTextContainer實例。然後你使用-[NSLayoutManager addTextContainer:]註冊這些容器。

下面是相關文檔:https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/CustomTextProcessing/CustomTextProcessing.html#//apple_ref/doc/uid/TP40009542-CH4-SW35

+0

我試過這個,它需要太多的時間,它也增加了內存。因爲我有非常大的文件 – Manimaran

+0

那麼我猜你用CoreText API卡住了,同時以某種方式補償了附件。或者,根據您想要呈現UI的方式,您需要使用懶惰算法並重用現有視圖。 – Dalzhim

+0

我重複使用現有的視圖('UITextView'),我從長文檔中獲得'NSAttributedString'。它由圖像組成('NSTextAttachment'和'HTML'表)。目前,我正在使用'CTFramesetterCreateWithAttributedString'將attributesString劃分爲多個具有768X1024大小的頁面,但它沒有給出確切的輸出(給出更多空格並修剪文本)。 – Manimaran

相關問題