一、案例演示

最近在整理一个聊天的项目的时候,发送图片的时候,会有一个三角的指向效果,指向这张图片的发送者。服务端返回给我们的图片只是一张矩形的图片,如何把一张矩形的图片或者View,加上一层自定义遮罩效果,就是本文要讲的内容。效果演示如下:第一张是一个View的遮罩效果,第二张是UIImageView的遮罩效果。

二、实现机制

在每一View的layer层中有一个mask属性,它就是专门来设置该View的遮罩效果的。该mask本身也是一个layer层,只需要生成一个自定义的layer,然后覆盖在需要遮罩的View上面即可。问题就归于如何生成入上图所示的不规则图片的Layer。CAShapeLayer可以根据几个点的依次连线,产生一个闭合空间的layer。如下图所示:

三、实现代码

实现方式为实现了CAShapeLayer的ViewMask的Category。

@implementation CAShapeLayer (ViewMask)+ (instancetype)createMaskLayerWithView : (UIView *)view{CGFloat viewWidth = CGRectGetWidth(view.frame);CGFloat viewHeight = CGRectGetHeight(view.frame);CGFloat rightSpace = 10.;CGFloat topSpace = 15.;CGPoint point1 = CGPointMake(0, 0);CGPoint point2 = CGPointMake(viewWidth-rightSpace, 0);CGPoint point3 = CGPointMake(viewWidth-rightSpace, topSpace);CGPoint point4 = CGPointMake(viewWidth, topSpace);CGPoint point5 = CGPointMake(viewWidth-rightSpace, topSpace+10.);CGPoint point6 = CGPointMake(viewWidth-rightSpace, viewHeight);CGPoint point7 = CGPointMake(0, viewHeight);UIBezierPath *path = [UIBezierPath bezierPath];[path moveToPoint:point1];[path addLineToPoint:point2];[path addLineToPoint:point3];[path addLineToPoint:point4];[path addLineToPoint:point5];[path addLineToPoint:point6];[path addLineToPoint:point7];[path closePath];CAShapeLayer *layer = [CAShapeLayer layer];layer.path = path.CGPath;return layer;
}@end

四、调用方式

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(40, 50, 80, 100)];
view.backgroundColor = [UIColor orangeColor];
[self.view addSubview:view];CAShapeLayer *layer = [CAShapeLayer createMaskLayerWithView:view];
view.layer.mask = layer;

iOS之使用CAShapeLayer实现复杂的View遮罩效果相关推荐

  1. ios开发——使用CALayer和Core Animation做动画效果

    一. CALayer (一). CALayer简介 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView,其实UIV ...

  2. android 3d侧拉抽屉,iOS动画指南 - 4.右拉的3D抽屉效果

    一切的动画其实都是假象,3D效果也是这样.本篇我们来做一个这样的特效. 先忽略掉3D效果,我们先要做的是一个右拉的抽屉效果. 总体思路: 1.创建一个ContainerViewController容器 ...

  3. Android 动画之View动画效果和Activity切换动画效果

    View动画效果: 1.>>Tween动画 通过对View的内容进行一系列的图形变换(平移.缩放.旋转.透明度变换)实现动画效果,补间动画需要使用<set>节点作为根节点,子节 ...

  4. android 图片圆角 遮罩_Android 自定义View练手Demo(一)实现圆角遮罩效果

    Android 自定义View系列文章 Android自定义View实现圆角遮罩效果 一图胜千言,有一个遮罩就会凸显出重点区域 1-1.jpg 本文通过两种方式来实现这种效果,来达到自定义View练手 ...

  5. RecyclerView加载不同view实现效果--IT蓝豹

    本项目由开发者:黄洞洞精心为初学者编辑RecyclerView的使用方法. RecyclerView加载不同view实现效果,支持加载多个view,并且支持用volley获取数据, 项目主要介绍: 初 ...

  6. android 动态创建view,react-native动态创建Android View 无效果

    问题描述 react-native动态创建Android View 无效果,我想在react-native里面直接点击函数进行创建,也就是通过module中的方法创建View 问题出现的环境背景及自己 ...

  7. iOS 类似亲宝宝app下拉刷新动画效果

    iOS 类似亲宝宝app下拉刷新动画效果,最近看了下这种效果,感觉有点意思.于是就实现了一下. 方案一 采用两个背景View1.View2,三个球ball1,ball2,ball3,将ball1,ba ...

  8. [Android]自定义View带效果的滚动数字

    [Android]自定义View带效果的滚动数字 @Author GQ 2016年07月29日 一个可以让数字滚动的View,可以自定义参数,是想要的那种效果! 原文github地址 效果图 Andr ...

  9. iOS学习:CAShapeLayer与DrawRect对比,与UIBezierPath画图形

    使用CAShapeLayer有以下一些优点 渲染快速.CAShapeLayer使用了硬件加速,绘制同一图形会比用Core Graphics快很多. 高效使用内存.一个CAShapeLayer不需要像普 ...

最新文章

  1. jsonarray和jsonObject的转化
  2. 获得诺贝尔奖的底层小职员 | 从来没有一个高手,是在一夜之间强大起来的
  3. 如何给Lombok Builder提供默认值
  4. [YTU]_2440( C++习题 复数类--重载运算符+,-,*,/)
  5. netstat [选项]
  6. python拼写检查_Python 怎样写一个拼写检查器
  7. 关于 IPv6 大规模部署,给我们带来了什么~
  8. HTTP Server Error 500 内部服务器错误
  9. 【Flink】Flink 源码之快照
  10. apache服务器_Apache+SVN 服务器搭建:
  11. HTML5期末大作业:体育主题网站设计——足球(9页) HTML+CSS+JavaScrip校园篮球网页作业成品 学校篮足球网页制作模板 学生简单体育运动网站设计成品
  12. linux下svn命令使用大全
  13. linux查看磁盘内存cpu
  14. 数据库防火墙:数据库防火墙的阻断方式
  15. rhel centos 源_Rhel centos 7的fips脚本
  16. win10python安装配置selenium
  17. php文本框添加表情,仿微信在对话框文字中插入Emoji表情包
  18. 华为手机左侧快捷方式_华为手机的这六个快捷键,让使用更简便!
  19. Material Design设计之【色彩】实践
  20. 关于互相帮忙投票的微信群、微信刷投票群、微信投票刷票群的详情介绍

热门文章

  1. [学习笔记]带修改主席树
  2. redis入门demo
  3. Python 爬起数据时 'gbk' codec can't encode character '\xa0' 的问题
  4. FPGA实战操作(1) -- SDRAM(Verilog实现)
  5. Spring之泛型依赖注入
  6. TortoiseSvn
  7. IntelliJ IDEA14 配置 SVN
  8. [leetcode]Edit Distance
  9. 在路上(on the road)
  10. magento 相关xml功能的介绍