Gần đây có rất nhiều câu hỏi về việc vẽ PDF.
Có, bạn có thể kết xuất PDF rất dễ dàng với UIWebView
nhưng không thể cung cấp hiệu suất và chức năng mà bạn mong đợi từ trình xem PDF tốt.
Bạn có thể vẽ một trang PDF thành CALayer hoặc UIImage . Apple thậm chí còn có mã mẫu để hiển thị cách vẽ một tệp PDF lớn trong UIScrollview có thể thu phóng
Nhưng các vấn đề tương tự tiếp tục cắt lên.
Phương pháp UIImage:
- PDF ở
UIImage
quy mô không tối ưu cũng như cách tiếp cận Lớp. - CPU và bộ nhớ đánh vào việc tạo ra
UIImages
từ mộtPDFcontext
giới hạn / ngăn không cho sử dụng nó để tạo kết xuất thời gian thực của các mức thu phóng mới.
Phương thức CATiledLayer:
- Có một Chi phí đáng kể (thời gian) vẽ một trang PDF đầy đủ thành một
CALayer
: các ô riêng lẻ có thể được nhìn thấy kết xuất (ngay cả với một chỉnh sửa kích thước ô) CALayers
Không thể chuẩn bị trước thời hạn (hiển thị ngoài màn hình).
Nói chung người xem PDF cũng khá nặng về bộ nhớ. Thậm chí giám sát việc sử dụng bộ nhớ của ví dụ PDF có thể phóng to của apple.
Trong dự án hiện tại của tôi, tôi đang phát triển trình xem PDF và hiển thị UIImage
một trang trong một luồng riêng (cũng có vấn đề ở đây!) Và trình bày nó trong khi tỷ lệ là x1. CATiledLayer
đá kết xuất trong một lần tỷ lệ> 1. iBooks có cách tiếp cận kép tương tự như khi bạn cuộn các trang bạn có thể thấy phiên bản độ phân giải thấp hơn của trang chỉ trong chưa đầy một giây trước khi phiên bản sắc nét xuất hiện.
Tôi hiển thị 2 trang mỗi bên của trang trong tiêu điểm để hình ảnh PDF sẵn sàng che dấu lớp trước khi bắt đầu vẽ. Các trang bị hủy một lần nữa khi chúng cách +2 trang so với trang tập trung.
Có ai có bất kỳ hiểu biết nào, cho dù nhỏ hay rõ ràng để cải thiện hiệu suất / xử lý bộ nhớ của Bản vẽ PDF? hoặc bất kỳ vấn đề nào khác được thảo luận ở đây?
EDIT: Một số lời khuyên (Tín dụng- Luke Mcneice, VdesmedT, Matt Gallagher, Johann):
Lưu bất kỳ phương tiện truyền thông vào đĩa khi bạn có thể.
Sử dụng brickSizes lớn hơn nếu kết xuất trên TiledLayers
init các mảng được sử dụng thường xuyên với các đối tượng giữ chỗ, xen kẽ một cách tiếp cận thiết kế khác là cách này
Lưu ý rằng hình ảnh sẽ hiển thị nhanh hơn một
CGPDFPageRef
Sử dụng
NSOperations
hoặc GCD & Blocks để chuẩn bị các trang trước thời hạn.gọi
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
trướcCGContextDrawPDFPage
để giảm mức sử dụng bộ nhớ trong khi vẽkhởi tạo của bạn
NSOperations
với một docRef là một ý tưởng tồi (bộ nhớ), bọc docRef thành một singleton.Hủy bỏ không cần thiết
NSOperations
Khi bạn có thể, đặc biệt là nếu họ sẽ sử dụng bộ nhớ, hãy cẩn thận khi để bối cảnh mở!Tái chế các đối tượng trang và hủy các khung nhìn không sử dụng
Đóng mọi bối cảnh mở ngay khi bạn không cần chúng
khi nhận được cảnh báo bộ nhớ phát hành và tải lại DocRef và bất kỳ trang Caches nào
Các tính năng PDF khác:
Nhận liên kết trong một tệp PDF (và ở đây và ở đây )
Lấy mục tiêu của liên kết (Lấy số trang từ
/Dest
mảng)
Bắt nguyên bản (và ở đây và ở đây và ở đây (vị trí tập trung))
Tìm kiếm (và tại đây ) (không hoạt động với tất cả các tệp PDF (một số chỉ hiển thị các ký tự lạ, tôi đoán đó là sự cố mã hóa nhưng tôi không chắc chắn) -Credit BrainFeeder)
Kết xuất và hiển thị ngoài màn hình - hiển thị trang tiếp theo để hiển thị nhanh / mượt
Tài liệu
- Quartz PDFObjects (Được sử dụng cho thông tin meta, chú thích, ngón tay cái)
- Thông số PDF của Abobe
Dự án ví dụ
- Apple / ZoomingPDF - thu phóng
UIScrollView
,,CATiledLayer
- vfr / reader - phóng to, phân trang ,
UIScrollView
.CATiledView
- trán / lá - phân trang với chuyển tiếp tốt đẹp
- / skim - mọi thứ có vẻ như (trình đọc / chỉnh sửa PDF cho OSX)
PSPDFKit
, nó không rẻ, nhưng đáng giá: pspdfkit.com