iOS之使用CAShapeLayer实现复杂的View遮罩效果
一、案例演示
最近在整理一个聊天的项目的时候,发送图片的时候,会有一个三角的指向效果,指向这张图片的发送者。服务端返回给我们的图片只是一张矩形的图片,如何把一张矩形的图片或者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遮罩效果相关推荐
- ios开发——使用CALayer和Core Animation做动画效果
一. CALayer (一). CALayer简介 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView,其实UIV ...
- android 3d侧拉抽屉,iOS动画指南 - 4.右拉的3D抽屉效果
一切的动画其实都是假象,3D效果也是这样.本篇我们来做一个这样的特效. 先忽略掉3D效果,我们先要做的是一个右拉的抽屉效果. 总体思路: 1.创建一个ContainerViewController容器 ...
- Android 动画之View动画效果和Activity切换动画效果
View动画效果: 1.>>Tween动画 通过对View的内容进行一系列的图形变换(平移.缩放.旋转.透明度变换)实现动画效果,补间动画需要使用<set>节点作为根节点,子节 ...
- android 图片圆角 遮罩_Android 自定义View练手Demo(一)实现圆角遮罩效果
Android 自定义View系列文章 Android自定义View实现圆角遮罩效果 一图胜千言,有一个遮罩就会凸显出重点区域 1-1.jpg 本文通过两种方式来实现这种效果,来达到自定义View练手 ...
- RecyclerView加载不同view实现效果--IT蓝豹
本项目由开发者:黄洞洞精心为初学者编辑RecyclerView的使用方法. RecyclerView加载不同view实现效果,支持加载多个view,并且支持用volley获取数据, 项目主要介绍: 初 ...
- android 动态创建view,react-native动态创建Android View 无效果
问题描述 react-native动态创建Android View 无效果,我想在react-native里面直接点击函数进行创建,也就是通过module中的方法创建View 问题出现的环境背景及自己 ...
- iOS 类似亲宝宝app下拉刷新动画效果
iOS 类似亲宝宝app下拉刷新动画效果,最近看了下这种效果,感觉有点意思.于是就实现了一下. 方案一 采用两个背景View1.View2,三个球ball1,ball2,ball3,将ball1,ba ...
- [Android]自定义View带效果的滚动数字
[Android]自定义View带效果的滚动数字 @Author GQ 2016年07月29日 一个可以让数字滚动的View,可以自定义参数,是想要的那种效果! 原文github地址 效果图 Andr ...
- iOS学习:CAShapeLayer与DrawRect对比,与UIBezierPath画图形
使用CAShapeLayer有以下一些优点 渲染快速.CAShapeLayer使用了硬件加速,绘制同一图形会比用Core Graphics快很多. 高效使用内存.一个CAShapeLayer不需要像普 ...
最新文章
- jsonarray和jsonObject的转化
- 获得诺贝尔奖的底层小职员 | 从来没有一个高手,是在一夜之间强大起来的
- 如何给Lombok Builder提供默认值
- [YTU]_2440( C++习题 复数类--重载运算符+,-,*,/)
- netstat [选项]
- python拼写检查_Python 怎样写一个拼写检查器
- 关于 IPv6 大规模部署,给我们带来了什么~
- HTTP Server Error 500 内部服务器错误
- 【Flink】Flink 源码之快照
- apache服务器_Apache+SVN 服务器搭建:
- HTML5期末大作业:体育主题网站设计——足球(9页) HTML+CSS+JavaScrip校园篮球网页作业成品 学校篮足球网页制作模板 学生简单体育运动网站设计成品
- linux下svn命令使用大全
- linux查看磁盘内存cpu
- 数据库防火墙:数据库防火墙的阻断方式
- rhel centos 源_Rhel centos 7的fips脚本
- win10python安装配置selenium
- php文本框添加表情,仿微信在对话框文字中插入Emoji表情包
- 华为手机左侧快捷方式_华为手机的这六个快捷键,让使用更简便!
- Material Design设计之【色彩】实践
- 关于互相帮忙投票的微信群、微信刷投票群、微信投票刷票群的详情介绍