- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { //Using code from http://stackoverflow.com/questions/1042830/retrieving-a-pixel-alpha-value-for-a-uiimage unsigned char pixel[1] = {0}; CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 1, NULL, kCGImageAlphaOnly); UIGraphicsPushContext(context); [self.image drawAtPoint:CGPointMake(-point.x, -point.y)]; UIGraphicsPopContext(); CGContextRelease(context); CGFloat alpha = pixel[0]/255.0f; BOOL transparent = alpha < 0.01f; return !transparent; }

一般在iOS的控件中,要不就是完全允许用户点击,要不就是禁止用户交互,这是可以通过设置控件的userInteractionEnabled属性来修改。如果添加的图片不是不规则形状的,而是矩形,这问题就简单多了,只需要将矩形图片对应的UIImageView的userInteractionEnabled设为YES,对半透明背景View(或者直接设置为一个按钮)设置点击事件处理,就可以点击实现半透明背景退出弹出界面。

现在的情况是这个矩形图片一分为二,一部分为实体的不规则形状图片,一部分为不规则形状的透明区域。很显然,问题的解决思路是:让手指能“穿透”这个不规则透明区域去点击背后的半透明背景,而不透明部分就不“穿透”。

前面说的userInteractionEnabled属性只是简单地一刀切设置控件是否允许用户操作(即可以响应手指触摸事件),更加灵活的设置方法是使用UIView的hitTest:withEvent:与pointInside:withEvent:。简单介绍下,iOS中的pointInside:withEvent:方法是用来判断当前的点击或者触摸事件的点是否在当前的view中,它被hitTest:withEvent:调用,通过对每个子视图调用pointInside:withEvent:决定最终哪个视图来响应此事件。如果一个子视图的pointInside:withEvent:返回NO,说明这个子视图不会响应点击事件,然后就去寻找更深层的子视图来找到最终响应触摸事件;返回YES就说明子视图能响应点击事件(但不一定是子视图本身响应,若子视图还有子视图的话,还会继续循环去找最终响应事件的子子视图)。

于是,本文的问题就可以这样转化:创建一个UIImageView的子类,重写pointInside:withEvent:方法,让矩形图片的透明区域的pointInside:withEvent:返回NO,而非透明区域的pointInside:withEvent:返回YES,如果能达到这个要求,透明区域点击事件穿透就能够实现。

现在的关键问题是怎么识别出这个透明区域。 
iOS中通常用的图片是PNG图片,这种图片有alpha通道,如果能获取PNG图片每个像素的alpha值,就不难判断出手指点击的图片区域是不是透明的。

http://blog.csdn.net/ralbatr/article/details/38388801

http://www.cocoachina.com/ios/20160208/15238.html

总结

如果你一步一步做到了这里,我想一定会有不少收益。不过,学而不思则罔,思而不学则殆。动手实践后还是应该总结提炼,优化滑动性能主要涉及三个方面:

避免图层混合

  • 确保控件的opaque属性设置为true,确保backgroundColor和父视图颜色一致且不透明。

  • 如无特殊需要,不要设置低于1的alpha值。

  • 确保UIImage没有alpha通道。

避免临时转换

  • 确保图片大小和frame一致,不要在滑动时缩放图片。

  • 确保图片颜色格式被GPU支持,避免劳烦CPU转换。

慎用离屏渲染

  • 绝大多数时候离屏渲染会影响性能。

  • 重写drawRect方法,设置圆角、阴影、模糊效果,光栅化都会导致离屏渲染。

  • 设置阴影效果是加上阴影路径。

  • 滑动时若需要圆角效果,开启光栅化。http://blog.csdn.net/pucker/article/details/41843511

 

http://www.cocoachina.com/ios/20160205/15233.html

http://blog.csdn.net/freedom2028/article/details/8040918

IOS杂记的更多相关文章

  1. iOS 杂记

    一,demo 1,视图跳转 MaryPopin:  https://github.com/Backelite/MaryPopin 2,Nimbus是一个开源的iOS框架,比起Three20,Nimbu ...

  2. iOS杂记-告警清理

    NS_ASSUME_NONNULL_BEGIN @interface Robot : NSObject @property (copy,readonly) NSString *name; - (nul ...

  3. ios程序开发杂记

    ios程序开发杂记 一.程序构建 与一般的程序构建无太大区别,都是源文件编译链接这一套,通常是在mac上做交叉编译,也就是利用xcode里带的ios编译工具集去生成arm架构的ios程序(或是x86的 ...

  4. iOS笔记杂记

    Google Mobile Ads SDK更新至7.2.1不能编译,添加依赖库QuartzCore.framework后正常编译 imageName会把image缓存到手机内存里,不适合大量图片浏览会 ...

  5. ios学习杂记

    commond  + alt + enter Xcode分屏.拖动xib连线

  6. 一些牛人分享的ios技巧,保留着

    摘要:记录一些网上非常牛的人写的博文.收藏起来. 以备日后需要时学习备用. 1:iOS中UIWebView的Javascript与Objective-C通信 http://imchao.net/201 ...

  7. iOS 博客资源精选

    摘要:记录一些网上非常牛的人写的博文.收藏起来. 以备日后需要时学习备用. 1:iOS中UIWebView的Javascript与Objective-C通信 http://imchao.net/201 ...

  8. iOS可视化动态绘制连通图

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  9. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

随机推荐

  1. HDU 3308 LCIS(线段树)

    Problem Description Given n integers.You have two operations:U A B: replace the Ath number by B. (in ...

  2. bzoj4448 [Scoi2015]情报传递

    第一问不解释,对于第二问的处理,可以使用cdq分治,假设分治的询问区间是[L,R],那么我们对于标号在[L,mid]的修改操作赋予一个权值,因为在当前[L,R]中[L,mid]的修改操作只会对[mid ...

  3. paper 89:视频图像去模糊常用处理方法

    随着“平安城市”的广泛建设,各大城市已经建有大量的视频监控系统,虽然监控系统己经广泛地存在于银行.商场.车站和交通路口等公共场所,但是在公安工作中,由于设备或者其他条件的限制,案情发生后的图像回放都存 ...

  4. C#.Net GC(garbage Collector) 垃圾回收器

    以前一直以为gc的原理很简单,也就是分代处理堆数据,直到我的膝盖中了一箭(好吧 直到有天汪涛和我说他面试携程的面试题 关于服务器和 工作站gc 的区别)其实我当时尚不知道 工作站和服务器有什么区别更不 ...

  5. java 中多线程和锁的使用

    关键词: implements  实现  Runnable 类 run()  方法 注意点 : 创建类的实例 InterfaceController inter=new InterfaceContro ...

  6. Javascript中的json操作

    <!doctype html> <html> <head> <title>extjs-json</title> <script typ ...

  7. 夺命雷公狗ThinkPHP项目之----企业网站28之网站前台左侧导航的实现

    我们基于刚才在model层的找顶级分类的代码在进行修改即可: <?php namespace Home\Controller; use Think\Controller; class Commo ...

  8. [php] How to debug PHP in the terminal

    Here I use Netbeans, xdebug to debug the PHP in the terminal of Ubuntu. 1. you have to install the x ...

  9. 用VS2010编C#程序扫盲 2

    0.正则表达式:http://www.runoob.com/csharp/csharp-regular-expressions.html 1.异常处理: try { // 引起异常的语句 } catc ...

  10. ubuntu遇到的命令

    sudo passwd root这个命令是给root用户设定密码.su root切换到root用户.sudo cp 文件 /var/www移动文件到一个目录unzip xxx.zip解压zip文件mk ...