现在的位置: 首页 > 综合 > 正文

IOS-升级101 非RectButton(透明区域不可点击View)

2018年05月26日 ⁄ 综合 ⁄ 共 1056字 ⁄ 字号 评论关闭

结论:
     用OBShapedButton:https://github.com/ole/OBShapedButton 就好了。方法是通过检验点击位置对应图片的alpha通道值决定是否响应(通过PointInseid返回值(返回no则系统认为不在bounds 就不处理了))。

缘由:
项目中我们会遇到 使用了一张图片作为button的Image或者BackgroudImage 这些图片存在alpha = 0的区域,点击透明区域一样可以触发按钮效果。这不是我们想要的,我们想要的是点击透明区域并不触发此UIcontrol!

资料:
OBShapedButton:https://github.com/ole/OBShapedButton
MLIgnoreTransparentButton:https://github.com/molon/MLIgnoreTransparentButton

分析了如上两个github源码之后理清了思路。
key:alpha==0

思路如下:
@1 每次点击的时候获取当前点击的touchPoint
@2 获取对应control的Image 与 backgroundImage 
@3 将其绘制到CGContext下
@4 创建CGContext 设置CGContext的bytes 每个像素点对应4个byte(不同的colorSplace可能不同) 分别为 Red Green Blue Alpha (这边Context一般只生成1像素的大小 并通过transformCTM来移动context 将点击的点移动到生成的这一个像素上 取值)
@5 将image会知道创建的CGcontext上
@6 当前touch点的alpha是否等于0
@7 根据alpha返回的值 决定是否响应此次点击
@8 通过- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event  决定是否响应此次点击(注意:先执行super此方法以排除点击out of bounds的情况。)




注意:hitTest会递归调用自己坐标系统下的view 是否响应。

注:一次点击会递归两次hitTest
原因是因为 UITouchPhaseBegin 与 UITouchPhaseEnd
hitTest中的event是无法取出 UITouch 可以通过hook全局的监听出来。
且根据打印结果看 hitTest执行完才产生产生对应UITouchPhaseBegin 与 UITouchPhaseEnd
(也就是说 touchphase 是两段的 但当hitTest执行完才被归纳)。

抱歉!评论已关闭.