2015-06-24 15 views
7

Jak mogę uzyskać piksel RGBA punktu z WKWebView?iOS WKWebView uzyskać piksel RGBA z punktu

Mam działające rozwiązanie dla UIWebView, ale zamiast tego chciałbym użyć WKWebView. Kiedy dotknę punktu na ekranie, jestem w stanie pobrać wartość koloru w RGBA z UIWebView na przykład (0,0,0,0), gdy jest przezroczysta lub coś podobnego (0.76,0.23,0.34,1), gdy nie jest przezroczysty. Zamiast tego WKWebView zawsze zwraca (0,0,0,0).

Więcej szczegółów

pracuję nad aplikacji iOS z WebView jako najbardziej górnego elementu UI.

WebView ma obszary, które są przezroczyste, dzięki czemu można zobaczyć podstawowe UIView.

WebView będzie ignorował dotknięcia na przezroczystych obszarach, a bazowy UIView powinien pobrać zdarzenie.

Nich zrobiłem zastąpić funkcję hitTest:

#import "OverlayView.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation OverlayView 

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event { 

    UIView* subview = [super hitTest:point withEvent:event]; // this will always be a webview 

    if ([self isTransparent:point fromView:subview.layer]) // if point is transparent then let superview deal with it 
    { 
     return [self superview]; 
    } 

    return subview; // return webview 
} 

- (BOOL) isTransparent:(CGPoint)point fromView:(CALayer*)layer 
{ 
    unsigned char pixel[4] = {0}; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast); 

    CGContextTranslateCTM(context, -point.x, -point.y); 

    [layer renderInContext:context]; 

    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    return (pixel[0]/255.0 == 0) &&(pixel[1]/255.0 == 0) &&(pixel[2]/255.0 == 0) &&(pixel[3]/255.0 == 0) ; 
} 

@end 

Moje założenie jest, że WKWebView ma inny CALayer lub ukryty UIView gdzie czerpać rzeczywiste internetowej, aby.

Odpowiedz

5
#import "OverlayView.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation OverlayView 

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event { 

    UIView* subview = [super hitTest:point withEvent:event]; // this should always be a webview 

    if ([self isTransparent:[self convertPoint:point toView:subview] fromView:subview.layer]) // if point is transparent then let superview deal with it 
    { 
     return [self superview]; 
    } 

    return subview; // return webview 
} 

- (BOOL) isTransparent:(CGPoint)point fromView:(CALayer*)layer 
{ 
    unsigned char pixel[4] = {0}; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast); 

    CGContextTranslateCTM(context, -point.x, -point.y); 

    UIGraphicsPushContext(context); 
    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES]; 
    UIGraphicsPopContext(); 

    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 

    return (pixel[0]/255.0 == 0) &&(pixel[1]/255.0 == 0) &&(pixel[2]/255.0 == 0) &&(pixel[3]/255.0 == 0) ; 
} 

@end 

Ten kod naprawił mój problem.

+0

Zmieniając tylko '[layer renderInContext: context];' w starym kodzie na 'UIGraphicsPushContext (context); [self drawViewHierarchyInRect: self.bounds afterScreenUpdates: YES]; UIGraphicsPopContext(); 'działa cudownie ... czasami nie wiem jak wy wymyślacie takie rzeczy. Dzięki! – Bruce