PDF'lerin çizimi hakkında son zamanlarda birçok soru oldu.
Evet, PDF'leri çok kolay bir şekilde oluşturabilirsiniz, UIWebView
ancak bu iyi bir PDF görüntüleyiciden beklediğiniz performans ve işlevselliği veremez.
Bir PDF sayfasını çizebilirsiniz bir CALayer için ya bir UIImage için . Apple , Zumlanabilir UIScrollview'da büyük bir PDF'in nasıl çizileceğini gösteren örnek kodlara bile sahip
Ancak aynı sorunlar sürekli artmaktadır.
UIImage Yöntemi:
- PDF'ın bir de
UIImage
optik bir Katman yaklaşımı yanı sıra ölçekli değil. - CPU ve bellek üreten çarptı
UIImages
bir gelenPDFcontext
gerçek zamanlı yeni zum-seviyelerinin işlemek oluşturmak için kullanarak limitleri / önler.
CATiledLayer Yöntemi:
- Tam bir PDF sayfası
CALayer
a'ya önemli bir Tepegöz (zaman) çekiyor : tek bir döşemenin oluşturulduğu görülebilir (bir tileSize ayarıyla bile) CALayers
önceden hazırlanamaz (ekran dışında işlenir).
Genellikle PDF görüntüleyiciler de bellekte oldukça ağırdır. Apple'ın yakınlaştırılabilir PDF örneğinin bellek kullanımını bile izleyin.
Şu anki projemde bir PDF görüntüleyici geliştiriyorum ve UIImage
bir sayfayı ayrı bir iş parçacığında (burada da sorunlar var!) Oluşturuyorum ve ölçek x1 iken sunuyorum. CATiledLayer
ölçek> 1 olduğunda tekme oluşturma. iBooks, sayfaları kaydırdığınızda benzer bir çift alma yaklaşımı izler ve net bir sürüm görünmeden önce sayfanın daha düşük bir res sürümünü bir saniyeden daha kısa bir süre görebilirsiniz.
PDF görüntüsünün çizilmeye başlamadan önce katmanı maskelemeye hazır olması için odaklanılan sayfanın her iki tarafını 2 sayfa oluşturuyorum.
Çizim PDF'lerinin performansını / bellek kullanımını iyileştirmek için ne kadar küçük veya açık olursa olsun, herhangi bir öngörü var mı? veya burada tartışılan başka sorunlar var mı?
EDIT: Bazı İpuçları (Kredi- Luke Mcneice, VdesmedT, Matt Gallagher, Johann):
Mümkün olduğunda tüm ortamları diske kaydedin.
TiledLayers'da görüntü oluşturuyorsanız daha büyük tileSizes kullanın
init sıkça yer tutucu nesnelerle diziler kullanılır, alternitively başka tasarım yaklaşımıdır bu bir
Görüntülerin bir
CGPDFPageRef
Kullanın
NSOperations
veya OBEB & Bloklar vaktinden sayfalarını hazırlamak.çizim sırasında bellek kullanımını azaltmak için
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
önce arayınCGContextDrawPDFPage
Şu Verilerinizi init'ing
NSOperations
bir docRef ile kötü bir fikir (bellek), bir tekil içine docRef sarın olduğunu.Gereksiz olarak iptal edin Yapabildiğiniz
NSOperations
zaman, özellikle bellek kullanıyorlarsa, bağlamları açık bırakmaya dikkat edin!Sayfa nesnelerini geri dönüştürün ve kullanılmayan görünümleri yok edin
Açık Bağlamları ihtiyacınız olmadığında kapatın
bellek uyarılarını alma hakkında DocRef ve tüm sayfa Önbelleklerini serbest bırakın ve yeniden yükleyin
Diğer PDF Özellikleri:
PDF içinde (ve burada ve burada ) Bağlantılar Alma
Bağlantının hedefini alma (Sayfa numarasını
/Dest
diziden alma)
Ham Metin Alma (ve burada ve Burada ve burada (konumlandırma odaklı))
Arama (ve burada ) (tüm PDF'lerle çalışmaz (bazıları sadece garip karakterler gösterir, sanırım bu bir kodlama sorunu ama emin değilim) -Kredi BrainFeeder)
CALayer ve Ekran Dışı İşleme - hızlı / düzgün görüntüleme için sonraki sayfayı oluştur
belgeleme
- Kuvars PDF Nesneleri (Meta bilgi, ek açıklamalar, küçük resimler için kullanılır)
- Abobe PDF Özellikleri
Örnek projeler
- Apple / ZoomingPDF - yakınlaştırma
UIScrollView
,,CATiledLayer
- VfR / okuyucu - yakınlaştırma, sayfalama,
UIScrollView
,CATiledView
- kaş / yapraklar - hoş geçişlerle sayfalama
- / skim - göründüğü her şey (OSX için PDF okuyucu / editör)
PSPDFKit
, ucuz değil, ama değer: pspdfkit.com