簡體   English   中英

如何使用NSString的sizeWithFont和drawInRect來訓練要繪制多少字符串

[英]How to use NSString's sizeWithFont and drawInRect to workout how much of a string to draw

我正在使用iOS中的CGContext繪制多個“頁面”圖像。 我在我的應用程序中廣泛使用了sizeWithFont和drawInRect組合。 我需要做的是在多個頁面中分割大量文本。 我可以調整它的大小並確定它是否需要另一頁,但我怎么知道在哪里砍它? 我是否必須做一個丑陋的循環來逐字檢查,直到找到一個完全適合頁面的字符串長度,然后在那個時候切斷字符串? 有更聰明的方法嗎?

有任何想法嗎?

謝謝。

NSString添加到UIKit用於繪制文本,您可以預先確定為給定字體呈現給定文本所需的確切空間量。 如果將文本拆分為頁面,則可以使用此方法。

– sizeWithFont:constrainedToSize:lineBreakMode:

假設已知字體和換行模式,請創建一個與頁面寬度相同的CGSize,並使用足夠的數字作為高度。 這將是我們約束文本的最大大小。

CGSize maximumSize = CGSizeMake(pageWidth, 999999999);
CGSize expectedSize = [veryLongString sizeWithFont:theFont constrainedToSize:maximumSize lineBreakMode:theLineBreakMode];

expectedSize將告訴我們文本將采取的大小假設它是否可以無限延伸(非常接近)。 要查找所需頁數,只需將總高度除以一頁的高度即可。

NSInteger totalPages = ceil(expectedSize.height / heightOfOnePage);

您還需要調整一頁的高度,以確保最后一行文本不會被剪裁。 為此,頁面的高度應該是字體行高的倍數。 假設初始頁面高度為300px ,字體高度為16px ,則會有一些剪裁為300/16 = 18.75 ,這不是一個整數。

NSInteger linesWithoutClipping = floor(initialPageHeight / theFont.lineHeight);
CGFloat optimalPageHeight = linesWithoutClipping * theFont.lineHeight;

取底值18並乘以字體行高16 ,我們得到最佳頁面高度288以確保沒有剪裁。

請注意,lineHeight是在iOS 4.0中引入的,但如果舊版本需要,您可以自己計算。

我解決這個問題的方法是按行返回。

NSArray * paragraphs = [text componentsSeparatedByString:@"\n"];

您仍然需要完成所有工作以確定分頁符等,但我發現這是目前為止最好的解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM