FAST和精益PDF查看器用于iPhone/iPad/IOS-提示和提示?最近有很多關于繪制PDF的問題。是的,您可以很容易地使用UIWebView但這不能給出您期望的良好PDF查看器的性能和功能。您可以繪制PDF頁面。給一個卡萊爾或到UIImage..蘋果甚至有示例代碼來展示如何繪制一個大的PDF在可縮放的UIScrollview中但同樣的問題不斷出現。UIImage方法:PDF在一個UIImage不要像用圖層法那樣進行光學縮放。CPU和內存在生成UIImages從PDFcontext限制/防止使用它來創建新的縮放級別的實時呈現。CATILedLayer法:有一個很大的開銷(時間)將完整的PDF頁繪制到CALayer:可以看到單個瓷磚的呈現(即使是平鋪大小的調整)。CALayers不能提前準備(在屏幕外呈現)。一般來說,PDF閱讀器的內存也很重。甚至監控蘋果的可縮放PDF示例的內存使用情況。在我當前的項目中,我正在開發一個PDF查看器,并呈現一個UIImage一個單獨的線程中的頁面(這里也有問題!)在刻度為x1的時候呈現出來。CATiledLayer一旦渲染的比例大于1,iBooks就會采用類似的雙取方式,就像滾動頁面一樣,在清晰的版本出現之前,您可以在不到一秒鐘的時間內看到頁面的較低分辨率版本。我呈現每頁2頁的焦點,這樣PDF圖像就可以在開始繪圖之前掩蓋圖層,當頁面離焦點頁面+2頁時,頁面就會再次被銷毀。有沒有人有任何洞察力,無論多小或多明顯,都能提高PDF的性能/內存處理能力嗎?或者這里討論的其他問題?編輯:一些小貼士(信用-盧克·麥克奈斯,維德梅德·T,馬特·加拉格爾,約翰):可以時將任何媒體保存到磁盤。如果在平鋪上渲染,請使用更大的平鋪尺寸在經常使用占位符對象的數組中,另一種設計方法是這一個注意,圖像呈現速度比CGPDFPageRef使用NSOperations或GCD&砌塊提前準備頁面。打電話CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);以前CGContextDrawPDFPage減少繪圖時的內存使用在你的NSOperations使用docRef是個壞主意(內存),將docRef包裝成一個單例。取消不必要NSOperations當你可以的時候,特別是如果他們要使用內存的話,小心不要讓上下文打開!回收頁面對象并銷毀未使用的視圖在不需要任何開放上下文時立即關閉它們接收內存警告釋放和重新加載DocRef和任何頁面緩存其他PDF功能:獲取PDF中的鏈接(和這里和這里)理解用于鏈接定位的PDF RECT轉換PDF annot日期字符串獲取鏈接的目標(從/Dest(數組)得到一張目錄文件標題和關鍵詞獲取原始文本(和這里和這里和這里(定位重點)搜索(和這里)(并非所有PDF都有效(有些只顯示奇怪的字符,我想這是編碼問題,但我不確定)-CreditBrainfeed)CA層和離屏渲染-渲染下一頁以快速/平滑顯示文獻資料石英PDFObjects(用于元信息、注釋、拇指)以上PDF規格示例項目蘋果/ZoomingPDF-放大,UIScrollView, CATiledLayerVFR/閱讀器-放大,尋呼,UIScrollView, CATiledView眉/葉-具有良好過渡的分頁脫脂-看上去的一切(OSX的PDF閱讀器/編輯器)
3 回答

catspeake
TA貢獻1111條經驗 獲得超0個贊
我將生成的映像緩存在磁盤上,并且總是在一個單獨的線程中預先生成兩到三個映像。 我不會用 UIImage
但是,當縮放為1時,則在圖層中繪制圖像。當發出內存警告時,這些瓷磚將自動釋放。
CGPDFPage
- (void)drawLayer: (CALayer*)layer inContext: (CGContextRef) context
CGAffineTransform currentCTM = CGContextGetCTM(context); if (currentCTM.a == 1.0 && baseImage) { //Calculate ideal scale CGFloat scaleForWidth = baseImage.size.width/self.bounds.size.width; CGFloat scaleForHeight = baseImage.size.height/self.bounds.size.height; CGFloat imageScaleFactor = MAX(scaleForWidth, scaleForHeight); CGSize imageSize = CGSizeMake(baseImage.size.width/imageScaleFactor, baseImage.size.height/imageScaleFactor); CGRect imageRect = CGRectMake((self.bounds.size.width-imageSize.width)/2, (self.bounds.size.height-imageSize.height)/2, imageSize.width, imageSize.height); CGContextDrawImage(context, imageRect, [baseImage CGImage]);} else { @synchronized(issue) { CGPDFPageRef pdfPage = CGPDFDocumentGetPage(issue.pdfDoc, pageIndex+1); pdfToPageTransform = CGPDFPageGetDrawingTransform(pdfPage, kCGPDFMediaBox, layer.bounds, 0, true); CGContextConcatCTM(context, pdfToPageTransform); CGContextDrawPDFPage(context, pdfPage); }}
CGPDFDocumentRef
pdfDoc
CGPDFDocumentRef

Smart貓小萌
TA貢獻1911條經驗 獲得超7個贊
PDFView
if let url = Bundle.main.url(forResource: "example", withExtension: "pdf") { let pdfView = PDFView(frame: view.frame) pdfView.document = PDFDocument(url: url) view.addSubview(pdfView)}
- 3 回答
- 0 關注
- 421 瀏覽
添加回答
舉報
0/150
提交
取消