SORU
8 EKİM 2010, Cuma


İ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:

  1. PDF olarak bir UIImage Optik yok ölçek olarak Katmanlı bir yaklaşım.
  2. CPU ve bellek üreten vurdu PDFcontextUIImages 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ın

    • Kullanmak sayfa önde hazırlamak NSOperations veya GCD & Blocks zaman.

    • CGContextDrawPDFPage önce CGContextSetInterpolationQuality(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:

    Belgeler

    Ö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
    8 EKİM 2010, Cuma


    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.

    Bunu Paylaş:
    • Google+
    • E-Posta
    Etiketler:

    YORUMLAR

    SPONSOR VİDEO

    Rastgele Yazarlar

    • knopik96

      knopik96

      7 Mayıs 2011
    • The Slow Mo Guys

      The Slow Mo

      15 AĞUSTOS 2010
    • thenewboston

      thenewboston

      4 ŞUBAT 2008