2015-06-24 26 views
7

Come si ottiene il colore del pixel RGBA di un punto da un WKWebView?iOS WKWebView ottiene il colore del pixel RGBA dal punto

Ho una soluzione funzionante per UIWebView, ma vorrei invece utilizzare WKWebView. Quando tocco su un punto dello schermo sono in grado di recuperare il valore del colore in RGBA da UIWebView ad esempio (0,0,0,0) quando è trasparente o qualcosa del genere (0,76,0.23,0.34,1) quando non trasparente Il WKWebView restituisce sempre (0,0,0,0) invece.

Maggiori dettagli

sto lavorando su un app iOS con una WebView come un elemento dell'interfaccia utente più alto.

La visualizzazione Web dispone di aree che sono trasparenti in modo da poter vedere il UIView sottostante.

La WebView ignora i tocchi sulle aree trasparenti e l'UIView sottostante recupera invece l'evento.

Perciò ho fatto ignorare la funzione 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 

La mia ipotesi è che il WKWebView ha un CALayer diverso o un UIView nascosta in cui disegnare la pagina web effettivo.

risposta

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 

Questo codice ha risolto il problema.

+0

Cambiando semplicemente '[layer renderInContext: context];' nel vecchio codice in 'UIGraphicsPushContext (context); [self drawViewHierarchyInRect: self.bounds afterScreenUpdates: YES]; UIGraphicsPopContext(); 'funziona meravigliosamente .. a volte non so come voi ragazzi capite cose come questa. Grazie! – Bruce