iOS WKWebView 从点获取 RGBA 像素颜色

Posted

技术标签:

【中文标题】iOS WKWebView 从点获取 RGBA 像素颜色【英文标题】:iOS WKWebView get RGBA pixel color from point 【发布时间】:2015-06-24 22:35:00 【问题描述】:

如何从 WKWebView 中获取点的 RGBA 像素颜色?

我有 UIWebView 的有效解决方案,但我想改用 WKWebView。当我点击屏幕的某个点时,我可以从 UIWebView 中检索 RGBA 中的颜色值,例如 (0,0,0,0) 当它是透明的或类似 (0.76,0.23,0.34,1) 时它不透明。 WKWebView 总是返回 (0,0,0,0)。

更多详情

我正在开发一个以 WebView 作为最*** ui 元素的 ios 应用程序。

WebView 具有透明的区域,以便您可以看到底层的 UIView。

WebView 应忽略透明区域的触摸,而底层 UIView 应取而代之检索事件。

因此我确实重写了 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

我的假设是 WKWebView 有一个不同的 CALayer 或一个隐藏的 UIView 来绘制实际的网页。

【问题讨论】:

【参考方案1】:
#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

这段代码解决了我的问题。

【讨论】:

通过将旧代码中的[layer renderInContext:context]; 更改为UIGraphicsPushContext(context); [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES]; UIGraphicsPopContext(); 效果非常好。有时我不知道你们是如何弄清楚这样的事情的。谢谢!

以上是关于iOS WKWebView 从点获取 RGBA 像素颜色的主要内容,如果未能解决你的问题,请参考以下文章

从点获取失真变换

iOS:当 WKWebView 获取运动传感器时显示一个白色方块

登录 ios swift 后从 wkwebview 获取令牌

WKWebview 未在 iOS 10.3 中完全加载

IOS - 第二次单击相同按钮时,WKWebview 在决定策略中获取空 url

SwiftUI - WKWebView 的 iOS 13 UIViewRepresentable 获取线程 1:EXC_BREAKPOINT 崩溃