2014-07-13 29 views
9

Sto cercando di catturare l'immagine che la pagina Web sta visualizzando all'utente, quindi posso eseguire alcune analisi del colore della pagina web. Quando cerco di ottenere l'immagine dal suo genitore, io sono fondamentalmente ottenendo una scatola bianca, anche se la pagina ha reso:WKWebView Screenshot

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) 

} 

Sembra a me come io non posso ottenere l'accesso alle proprietà del reale visualizza (in questo caso i limiti) all'interno della webView. Quando provo ad accedervi, i barfs compilatore:

/Users/josh/Canary/MacOsCanary/canary/canary/Modules/Overview/Overview.swift:55:37: '(NSView !, stringForToolTip: NSToolTipTag, punto : NSPoint, userData: UnsafePointer <()>) -> String! ' non ha un membro chiamato 'bounds'

La mia ipotesi è che questo stia accadendo a causa dell'approccio delle estensioni usato da OS X e iOS. Qualche idea o dovrei tornare a utilizzare la legacy WebView?

+0

Stai provando ad accedere a "limiti" su una stringa !. – nhgrif

+0

@Josh hai trovato una soluzione per iOS? Attualmente sto usando snapshotViewAfterScreenUpdates. Ma devo chiamarlo dopo che la webview è stata renderizzata, quindi aspetto un 0.1 sec in didFinishNavigation e chiamo snapshotViewAfterScreenUpdates. Non molto comodo e affidabile ( – sidslog

risposta

1

Mi rendo conto che la domanda era per Mac OS X, ma ho trovato questa pagina mentre cercavo una soluzione iOS. La mia risposta di seguito non funziona su Mac OS X poiché la chiamata API drawViewHierarchyInRect() è attualmente solo iOS, ma la metto qui come riferimento per altri utenti iOS.

Questo Stackoverflow answer ha risolto per me su iOS 8 con WKWebView. Il codice di esempio di questa risposta è in Objective-C ma l'equivalente di Swift per andare in una sottoclasse o in un'estensione di UIView sarebbe lungo le linee del codice seguente. Il codice ignora il valore restituito da drawViewHierarchyInRect(), ma potresti voler prestare attenzione ad esso.

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

mi sono trovato nella stessa barca, oggi, ma hanno trovato una soluzione (utilizzando API private).

Se non ci si rivolge l'App Store e, in generale non hanno paura di usare le API private, ecco un modo per catturare screenshot di WKWebView di su OS X:

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; 
    } 
} 

Nota: questa soluzione funziona solo su iOS.