2014-07-13 20 views
9

Web sayfasının görüntülediği görüntüyü yakalamaya çalışıyorum, bu yüzden web sayfasının bazı renk analizlerini yapabilirim. Ben, yani ana görüntüyü elde etmeye çalışmak zaman, temelde sayfa render olsa bile, beyaz bir kutu alıyorum: Ben gerçek özelliklerine erişim elde edemez gibiWKWebView Ekran resimleri

func makeImageSnapshot()-> (NSImage) 
{ 


    let imgSize = self.view.bounds.size 
    let bir = self.viewbitmapImageRepForCachingDisplayInRect(self.webView!.view.bounds) 

    bir.size = imgSize 
    self.webView.cacheDisplayInRect(self.view.bounds, toBitmapImageRep:bir) 

    let image = NSImage(size:imgSize) 
    image.addRepresentation(bir) 
    self.image = image 

    return image 
} 

func saveSnapshot() 
{ 
    let imgRep = self.image!.representations[0] 
    let data = imgRep.representationUsingType(NSBitmapImageFileType.NSPNGFileType, properties: nil) 
    data.writeToFile("/tmp/file.png", atomically: false) 

} 

Bana bakıyor webView içindeki görünümü (bu durumda sınırlar). Bunu erişmeye çalıştığınızda, derleyici Barfs:

/Users/josh/Canary/MacOsCanary/canary/canary/Modules/Overview/Overview.swift:55:37: '(NSView !, stringForToolTip: NSToolTipTag, nokta : NSPoint, kullanıcıData: UnsafePointer <()>) -> Dize! ' "Sınırları"

adında bir üyeye sahip değil. Bu durumun OS X ve iOS tarafından kullanılan uzantı yaklaşımı nedeniyle gerçekleştiği tahmin ediliyor. Herhangi bir fikir mi yoksa eski Web Görüntülemeyi kullanmaya mı dönmeliyim?

+0

Bir String'deki "sınırlar" a erişmeye çalışıyorsunuz. – nhgrif

+0

@Josh iOS için bir çözüm buldunuz mu? Şu anda snapshotViewAfterScreenUpdates kullanıyorum. Ama web görüntülendikten sonra onu aramak zorundayım, bu yüzden didFinishNavigation'da 0.1 sn bekliyorum ve snapshotViewAfterScreenUpdates'i çağırıyorum. Çok rahat ve güvenilir değil ( – sidslog

cevap

1

Sorunun Mac OS X için olduğunu anladım, ancak bir iOS çözümü ararken bu sayfayı buldum. Aşağıdaki cevabım, drawViewHierarchyInRect() API çağrısı şu anda yalnızca iOS olduğu için Mac OS X'te çalışmaz, ancak diğer iOS araştırmacıları için referans olarak buraya koydum.

Bu Stackoverflow answer, bir WKWebView ile iOS 8'de benim için çözdü. Bu yanıtın örnek kodu Objective-C'dir, ancak UIView alt sınıfında veya uzantısında gitmek için Swift eşdeğeri aşağıdaki kod satırları boyunca olacaktır. Kod, drawViewHierarchyInRect() öğesinin dönüş değerini yoksayar, ancak buna dikkat etmek isteyebilirsiniz.

func imageSnapshot() -> UIImage 
{ 
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, true, 0); 
    self.drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true); 
    let snapshotImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return snapshotImage; 
} 
0

Bugün kendisiyle aynı teknede buldum ancak bir çözüm buldum (özel API'leri kullanarak). App Store'u hedeflemeyen ve genellikle özel API'leri kullanarak korkmuyoruz ediyorsanız

, burada OS X üzerinde WKWebView yılların ekran yakalamak için bir yolu şudur:

https://github.com/lemonmojo/WKWebView-Screenshot

2

Swift 3

extension WKWebView { 
    func screenshot() -> UIImage? { 
     UIGraphicsBeginImageContextWithOptions(self.bounds.size, true, 0); 
     self.drawHierarchy(in: self.bounds, afterScreenUpdates: true); 
     let snapshotImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
     return snapshotImage; 
    } 
} 

Not: Bu çözüm yalnızca iOS'ta çalışır.