2014-07-13 16 views
9

मैं छवि को कैप्चर करने की कोशिश कर रहा हूं कि वेबव्यू उपयोगकर्ता को प्रदर्शित कर रहा है, इसलिए मैं वेब पेज का कुछ रंग विश्लेषण कर सकता हूं। जब मैं उसे अपने जनक है से छवि प्राप्त करने की कोशिश, मैं मूल रूप से एक सफेद बॉक्स मिल रहा है, भले ही पेज गाया गया है:WKWebView स्क्रीनशॉट

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) 

} 

यह मेरे लिए लगता है कि मैं वास्तविक के गुणों के लिए उपयोग नहीं कर सकते वेब व्यू के अंदर देखें (इस मामले में सीमाएं)। जब मैंने इसे तक पहुँचने का प्रयास, संकलक barfs:

/Users/josh/Canary/MacOsCanary/canary/canary/Modules/Overview/Overview.swift:55:37: '(NSView !, stringForToolTip: NSToolTipTag, बिंदु : एनएसपीओटी, उपयोगकर्ता डेटा: असुरक्षित पॉइंटर <()>) -> स्ट्रिंग! ' 'सीमा' नामक सदस्य नहीं है

मेरा अनुमान है कि यह ओएस एक्स और आईओएस द्वारा उपयोग किए जाने वाले एक्सटेंशन दृष्टिकोण के कारण हो रहा है। कोई विचार, या क्या मैं सिर्फ विरासत WebView का उपयोग करने के लिए वापस जाना चाहिए?

+0

आप स्ट्रिंग पर "सीमाएं" तक पहुंचने का प्रयास कर रहे हैं! – nhgrif

+0

@ जॉश क्या आपको आईओएस के लिए समाधान मिला है? वर्तमान में मैं snapshotViewAfterScreenUpdates का उपयोग कर रहा हूँ। लेकिन मुझे वेबव्यू प्रस्तुत करने के बाद इसे कॉल करना होगा, इसलिए मैंने 0.1 सेकंड की प्रतीक्षा की है फिनिशनविगेशन और स्नैपशॉटव्यूएफ्टरस्क्रीनअपडेट्स को कॉल करें। बहुत ही विश्वसनीय और भरोसेमंद नहीं है ( – sidslog

उत्तर

1

मुझे एहसास हुआ कि यह प्रश्न मैक ओएस एक्स के लिए था, लेकिन मुझे यह पृष्ठ आईओएस समाधान खोजने के दौरान मिला। नीचे मेरा जवाब मैक ओएस एक्स पर काम नहीं करता है क्योंकि drawViewHierarchyInRect() एपीआई कॉल वर्तमान में केवल आईओएस है, लेकिन मैंने इसे अन्य आईओएस खोजकर्ताओं के संदर्भ में यहां रखा है।

यह Stackoverflow answer इसे मेरे लिए आईओएस 8 पर WKWebView के साथ हल किया गया। उस उत्तर का नमूना कोड उद्देश्य-सी में है लेकिन एक UIView उप-वर्ग या एक्सटेंशन में जाने के लिए स्विफ्ट समतुल्य नीचे दिए गए कोड की पंक्तियों के साथ होगा। कोड drawViewHierarchyInRect() के वापसी मान को अनदेखा करता है, लेकिन आप इसे ध्यान देना चाहेंगे।

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

आज मुझे एक ही नाव में मिला लेकिन एक समाधान मिला (निजी एपीआई का उपयोग करके)।

आप ऐप स्टोर को लक्षित नहीं कर रहे हैं और आम तौर पर निजी API का उपयोग करके से डरते नहीं हैं, यहाँ WKWebView के के स्क्रीनशॉट पर कब्जा करने के ओएस एक्स पर एक तरीका है:

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

2

स्विफ्ट 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; 
    } 
} 

नोट: यह समाधान केवल आईओएस पर काम करता है।

संबंधित मुद्दे