2014-07-13 6 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) 

} 

그것은 나에게 보인다 WebView 내부의보기 (이 경우에는 경계). 내가 그것을 액세스하려고, 컴파일러 barfs :

/Users/josh/Canary/MacOsCanary/canary/canary/Modules/Overview/Overview.swift:55:37 '(NSView의! stringForToolTip : NSToolTipTag, 지점 : NSPoint, userData : UnsafePointer <()>) -> String! ' 'bounds'라는 회원이 없습니다

내 생각 엔 OS X 및 iOS에서 사용되는 확장 접근 방식 때문입니다. 어떤 아이디어가 필요합니까? 아니면 기존 WebView를 다시 사용해야합니까?

+0

문자열의 "경계"에 액세스하려고합니다. – nhgrif

+0

@ Josh iOS 용 솔루션을 찾았습니까? 현재 나는 snapshotViewAfterScreenUpdates를 사용하고 있습니다. 하지만 webview가 렌더링 된 후에 호출해야하므로 didFinishNavigation에서 0.1 초를 기다렸다가 snapshotViewAfterScreenUpdates를 호출합니다. 그리 그리 convinient하고 안정적으로 ( – sidslog

답변

1

나는 Mac OS X에 대한 질문을 알고 있지만,이 페이지는 iOS 솔루션을 검색하는 동안 발견되었습니다. drawViewHierarchyInRect() API 호출은 현재 iOS 전용이므로 Mac OS X에서는 아래의 내 대답이 작동하지 않지만 여기를 다른 iOS 검색자를위한 참조로 사용합니다.

Stackoverflow answer은 iOS 8에서 WKWebView로 해결했습니다. 그 대답의 샘플 코드는 Objective-C에 있지만 UIView 하위 클래스 또는 확장에 들어가는 Swift 코드는 아래 코드 줄에 표시됩니다. 이 코드는 drawViewHierarchyInRect()의 반환 값을 무시하지만주의해야 할 수도 있습니다.

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

오늘도 같은 보트에 있었지만 해결책을 찾았습니다 (개인 API 사용). 당신이 앱 스토어를 대상으로하지 일반적으로 개인 API를 사용하여 두려워하지 않는 경우

, 여기에 OS의 X에 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; 
    } 
} 

참고 :이 해결책은 iOS에서만 작동합니다.