İPhone / için hızlı ve Yalın bir PDF Görüntüleyici / iOs ipuçları iPad?
Çok Soru son zamanlarda çizim PDF ilgili olmuştur.
Evet, PDF çok kolay UIWebView
ile oluşturabilirsiniz ama bu cant performans ve iyi bir PDF görüntüleyici beklediğiniz işlevsellik verin.
PDF Sayfa to a CALayer to a UIImage çizebilirsiniz. Apple bile büyük bir PDF in a Zoomable UIScrollview çizmek nasıl göstermek için örnek kod var
Ama aynı sorunları dertten kurtulmadı.
Yöntem Uİİmage:
- PDF olarak bir
UIImage
Optik yok ölçek olarak Katmanlı bir yaklaşım. - CPU ve bellek üreten vurdu
PDFcontext
UIImages
bir oluşturmak için kullanarak engeller/sınırları gerçek zamanlı yeni render zoom-düzeyleri.
CATiledLayer Yöntemi:
- 3=başlangıç
- Önemli bir Yükü (saat)var
CALayer
için tam bir PDF Sayfa çizim: çini işleme görülebilir bireysel (tileSize bir çimdik bile) CALayers
cant önceden hazırlıklı olması süresi (ekran düzenleniyor).Genellikle PDF izleyiciler bellek üzerinde oldukça ağır. Hatta monitör Apple'ın bakıştan PDF örnek bellek kullanımı.
Benim geçerli projede, bir PDF görüntüleyici geliştirme ve ben ayrı bir iş parçacığı bir sayfa (burada da sorunlar!)
UIImage
bir render ediyorum ve ölçek ise zararlı x1.CATiledLayer
işleme ölçek ^ sonra devreye giriyor . 1. Eğer oyun arasından seçim yapabilirsiniz net bir şekilde gösterilir önce bir saniyeden daha az için sayfanın düşük çözünürlüklü bir sürümünü görebilirsiniz sayfaları kaydırma çift olarak benzer bir yaklaşım getiriyor.Sohbet 2 sayfa sayfa her tarafı işleme PDF resim çizmeye başlamadan önce katman maskesi için hazır olduğunu odaklan.Sayfa 2 Sayfa uzak duruldu sayfasından zaman tekrar yok olurlar.
Herkes Çizim PDF herhangi bir anlayış, ne kadar küçük ya da belirgin performans/ bellek kullanımı artırmak için hiçbir sorun var mı? ya da başka bir konu burada tartışıldı mı?
DÜZENLEME:(Kredi - Luke Mcneice,VdesmedT,Matt Gallagher,Johann) Bazı İpuçları:
Ne zaman disk için herhangi bir medya kaydedin.
Eğer TiledLayers işleme eğer büyük tileSizes kullanın
ınit sık yer tutucu nesneleri diziler, alternitively başka bir tasarım yaklaşımı kullanılır this one
Görüntüleri daha hızlı
CGPDFPageRef
bir daha hale getirecek unutmayınKullanmak sayfa önde hazırlamak
NSOperations
veya GCD & Blocks zaman.CGContextDrawPDFPage
önceCGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
çizim sırasında bellek kullanımını azaltmak için Araınit bir docRef
NSOperations
kötü bir fikir (bellek) para senin, bir tek içine docRef sarın.Söylemeye gerek yok, özellikle eğer bellek kullanarak olacak eğer yapabilirsen 14**, iptal, bağlamlarda da olsa açık bırakarak dikkat!
Sayfa nesneleri geri dönüşüm ve kullanılmayan manzarası yok
Kapatın Bağlamlarda onlara ihtiyacın yok bitmez
alma hafıza uyarıları ve DocRef ve herhangi bir sayfanın Önbelleğe sürümü yeniden yükle
Diğer PDF Özellikleri:
Getting Links inside a PDF (here here)
Getting the target of the link (
/Dest
diziden sayfa numarası Alma)
Getting Raw Text (here Here here (konumlandırma odaklanmış))
Searching(here) (çalışmıyor ile PDF (sadece bazı Haritayı garip karakterler, sanırım bu bir kodlama sorunu ama emin değilim) -Kredi BrainFeeder)
CALayer and Off-Screen Rendering hızlı/düz ekran için bir sonraki sayfayı oluşturmak
Belgeler
- Quartz PDFObjects (meta bilgisi, ek açıklamalar, başparmak için Kullanılır)
- Abobe PDF Spec
Örnek projeler
- Apple/ ZoomingPDF - yakınlaştırma,
UIScrollView
,CATiledLayer
- vfr/ reader - yakınlaştırma, çağrı,
UIScrollView
,CATiledView
- brow/ leaves - güzel geçişler ile disk belleği
- / skim - görünüşe göre her şey () için PDF okuyucu/editörü)
CEVAP
Aynı yaklaşım dışında uygulama bu tür approximatively kullanarak inşa var :
- Ben disk üzerinde oluşturulan görüntü önbellek ve her zaman ayrı bir iş parçacığı önceden iki ya da üç görüntü oluşturur.
UIImage
ile kaplamayı bilmiyorum ama yakınlaştırma 1 olduğunda yerine katmanı resim çizmek. Bu karolar bellek uyarı verildiği zaman otomatik olarak çıkacak.
Kullanıcı yakınlaştırma başlatmak zaman, ben CGPDFPage
elde ve uygun BLR kullanarak işlemek. - (void)drawLayer: (CALayer*)layer inContext: (CGContextRef) context
kodu olduğunu
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);
}
}
sorun nesne CGPDFDocumentRef
içeren. Ben bu işi bırakıyorum çünkü pdfDoc
özellik erişimi parçası senkronize ve memoryWarnings alırken yeniden oluşturun. CGPDFDocumentRef
nesne nasıl kurtulacağımı bulamadım bazı iç önbellekleme yapmak gibi görünüyor.
Dönüştürme iPad için iPhone Film Şerid...
İPad için giriş düğmeleri stil ve iPho...
iPhone/iPad/): Nasıl benim IP adresi P...
Nasıl iPhone/iPad cihaz üzerinde/özgür...
Ne kadar evrensel bir iPhone/iPad uygu...