2014-07-13 7 views
9

Ich versuche, das Bild, das die Webansicht dem Benutzer anzeigt, zu erfassen, damit ich eine Farbanalyse der Webseite vornehmen kann. Wenn ich versuche, das Bild zu bekommen von ihm Eltern, ich im Grunde bin ein weißes Feld bekommen, auch wenn die Seite gerendert hat:WKWebView Screenshots

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) 

} 

Es sieht für mich wie ich keinen Zugriff auf die Eigenschaften der tatsächlichen bekommen Ansicht (in diesem Fall die Grenzen) innerhalb des WebView. Wenn ich versuche, darauf zuzugreifen, wird der Compiler barfs:

/Users/josh/Canary/MacOsCanary/canary/canary/Modules/Overview/Overview.swift:55:37: '(NSView !, StringForToolTip: NSToolTipTag, Punkt : NSPoint, userData: UnsafePointer <()>) -> String! ' hat kein Mitglied namens "Grenzen"

Meine Vermutung ist, dass dies aufgrund der Erweiterungen von OS X und iOS geschieht. Irgendwelche Ideen, oder sollte ich einfach zum alten WebView zurückkehren?

+0

Sie versuchen, auf "Grenzen" auf einem String zuzugreifen !. – nhgrif

+0

@Josh hast du eine Lösung für iOS gefunden? Derzeit verwende ich snapshotViewAfterScreenUpdates. Aber ich muss es aufrufen, nachdem die Webansicht gerendert wurde, also warte ich in didFinishNavigation für 0.1 Sekunden und rufe snapshotViewAfterScreenUpdates auf. Nicht sehr praktisch und zuverlässig ( – sidslog

Antwort

1

Ich weiß, dass die Frage für Mac OS X war, aber ich fand diese Seite während der Suche nach einer iOS-Lösung. Meine Antwort unten funktioniert nicht unter Mac OS X, da der API-Aufruf drawViewHierarchyInRect() derzeit nur iOS ist, aber ich stelle ihn hier als Referenz für andere iOS-Sucher ein.

Diese Stackoverflow answer löste es für mich auf iOS 8 mit einem WKWebView. Der Beispielcode dieser Antwort befindet sich in Objective-C, aber das Swift-Äquivalent, das in einer UIView-Unterklasse oder -Extension enthalten ist, entspricht den folgenden Zeilen. Der Code ignoriert den Rückgabewert von drawViewHierarchyInRect(), aber Sie sollten darauf achten.

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

Ich fand mich heute im selben Boot aber fand eine Lösung (mit privaten APIs).

Wenn Sie nicht mit dem App Store Targeting und sind in der Regel keine Angst privaten APIs verwenden, hier eine Möglichkeit, Screenshots von WKWebView der auf OS X zu erfassen:

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

2

Swift 3

Hinweis: Diese Lösung funktioniert nur unter iOS.