http://blog.csdn.net/kevinpake/article/details/41205715

我们在做iOS开发的时候,往往需要实现不规则形状的头像,如:

那如何去实现?

通常图片都是矩形的,如果想在客户端去实现不规则的头像,需要自己去实现。

1.使用layer去实现, 见http://blog.csdn.net/johnzhjfly/article/details/39993345

2.使用CAShapeLayer, CALayer如何去实现

我们来看看如何使用CAShapeLayer去实现,

定义一个ShapedImageView,继承于UIView, 代码如下:

  1. #import "ShapedImageView.h"
  2. @interface ShapedImageView()
  3. {
  4. CALayer      *_contentLayer;
  5. CAShapeLayer *_maskLayer;
  6. }
  7. @end
  8. @implementation ShapedImageView
  9. - (instancetype)initWithFrame:(CGRect)frame
  10. {
  11. self = [super initWithFrame:frame];
  12. if (self) {
  13. [self setup];
  14. }
  15. return self;
  16. }
  17. - (void)setup
  18. {
  19. _maskLayer = [CAShapeLayer layer];
  20. _maskLayer.path = [UIBezierPath bezierPathWithOvalInRect:self.bounds].CGPath;
  21. _maskLayer.fillColor = [UIColor blackColor].CGColor;
  22. _maskLayer.strokeColor = [UIColor redColor].CGColor;
  23. _maskLayer.frame = self.bounds;
  24. _maskLayer.contentsCenter = CGRectMake(0.5, 0.5, 0.1, 0.1);
  25. _maskLayer.contentsScale = [UIScreen mainScreen].scale;
  26. _contentLayer = [CALayer layer];
  27. _contentLayer.mask = _maskLayer;
  28. _contentLayer.frame = self.bounds;
  29. [self.layer addSublayer:_contentLayer];
  30. }
  31. - (void)setImage:(UIImage *)image
  32. {
  33. _contentLayer.contents = (id)image.CGImage;
  34. }
  35. @end

声明了用于maskLayer个CAShapedLayer, CAShapedLayer有个path的属性,将内容Layer的mask设置为maskLayer, 就可以获取到我们想要的形状。

path我们可以使用CAMutablePath任意的构造,上述的代码运行想过如下:

如果将代码改成

  1. _maskLayer = [CAShapeLayer layer];
  2. _maskLayer.path = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:20].CGPath;
  3. _maskLayer.fillColor = [UIColor blackColor].CGColor;
  4. _maskLayer.strokeColor = [UIColor redColor].CGColor;
  5. _maskLayer.frame = self.bounds;
  6. _maskLayer.contentsCenter = CGRectMake(0.5, 0.5, 0.1, 0.1);
  7. _maskLayer.contentsScale = [UIScreen mainScreen].scale;                 //非常关键设置自动拉伸的效果且不变形
  8. _contentLayer = [CALayer layer];
  9. _contentLayer.mask = _maskLayer;
  10. _contentLayer.frame = self.bounds;
  11. [self.layer addSublayer:_contentLayer];

的效果:

如果将代码改成:

  1. CGMutablePathRef path = CGPathCreateMutable();
  2. CGPoint origin = self.bounds.origin;
  3. CGFloat radius = CGRectGetWidth(self.bounds) / 2;
  4. CGPathMoveToPoint(path, NULL, origin.x, origin.y + 22 *radius);
  5. CGPathMoveToPoint(path, NULL, origin.x, origin.y + radius);
  6. CGPathAddArcToPoint(path, NULL, origin.x, origin.y, origin.x + radius, origin.y, radius);
  7. CGPathAddArcToPoint(path, NULL, origin.x + 22 * radius, origin.y, origin.x + 22 * radius, origin.y + radius, radius);
  8. CGPathAddArcToPoint(path, NULL, origin.x + 22 * radius, origin.y + 22 * radius, origin.x + radius, origin.y + 2  * radius, radius);
  9. CGPathAddLineToPoint(path, NULL, origin.x, origin.y + 22 * radius);
  10. _maskLayer = [CAShapeLayer layer];
  11. _maskLayer.path = path;
  12. _maskLayer.fillColor = [UIColor blackColor].CGColor;
  13. _maskLayer.strokeColor = [UIColor clearColor].CGColor;
  14. _maskLayer.frame = self.bounds;
  15. _maskLayer.contentsCenter = CGRectMake(0.5, 0.5, 0.1, 0.1);
  16. _maskLayer.contentsScale = [UIScreen mainScreen].scale;                 //非常关键设置自动拉伸的效果且不变形
  17. _contentLayer = [CALayer layer];
  18. _contentLayer.mask = _maskLayer;
  19. _contentLayer.frame = self.bounds;
  20. [self.layer addSublayer:_contentLayer];

将是这个效果:

理论上我们可以构造出任意想要的形状,但是有些形状如果你不熟悉几何知识的话是构造不出正确的

path的,从代码上我们可以看到我们可以通过设置CALayer的contents属性来设置显示的内容,那我们

是不是可以通过设置CAShapedLayer的contents来设置maskLayer呢?答案是肯定的,代码如下:

  1. _maskLayer = [CAShapeLayer layer];
  2. _maskLayer.fillColor = [UIColor blackColor].CGColor;
  3. _maskLayer.strokeColor = [UIColor clearColor].CGColor;
  4. _maskLayer.frame = self.bounds;
  5. _maskLayer.contentsCenter = CGRectMake(0.5, 0.5, 0.1, 0.1);
  6. _maskLayer.contentsScale = [UIScreen mainScreen].scale;                 //非常关键设置自动拉伸的效果且不变形
  7. _maskLayer.contents = (id)[UIImage imageNamed:@"gray_bubble_right@2x.png"].CGImage;
  8. _contentLayer = [CALayer layer];
  9. _contentLayer.mask = _maskLayer;
  10. _contentLayer.frame = self.bounds;
  11. [self.layer addSublayer:_contentLayer];

gray_bubble_right就是你想要的形状,运行效果如下:

源代码:https://github.com/heavensword/ShapedImageView

iOS 不规则的ImageView的更多相关文章

  1. iOS开发之ImageView复用实现图片无限轮播

    在上篇博客中iOS开发之多图片无缝滚动组件封装与使用给出了图片无限轮播的实现方案之一,下面在给出另一种解决方案.今天博客中要说的就是在ScrollView上贴两个ImageView, 把ImageVi ...

  2. iOS 设置图片imageView圆角——对图片进行裁剪

    以前设置图片圆角总是把imageView设置成圆形,然后设置maskToBounds为YES,其实这样处理很消耗性能,图片多了之后比较卡,最好将图片进行裁剪后显示:这里有个分类可以用: UIImage ...

  3. iOS开发——给ImageView添加点击事件

          给ImageView添加点击事件   1: cell.pictureView.userInteractionEnabled = YES; 2: UITapGestureRecognizer ...

  4. iOS -实现imageView中的button响应点击事件的方法

    <pre name="code" class="cpp" style="font-size: 13px;">/** imagev ...

  5. IOS 多个ImageView图片层叠透明区域点击事件穿透

    经常用到多个透明图片层叠,但又需要获取不同图片的点击事件,本文实现图片透明区域穿透点击事件 实现人体各个部位点击 - (BOOL) pointInside:(CGPoint)point withEve ...

  6. iOS OC利用imageview属性切出类似圆柱图形

    效果一: 效果二: 上边的图形我也数不出来名字,,暂称圆柱正切图形吧,看到这样的需求似不似在想各种插件,各种切图方法了呢... UIImageView的属性可以轻松搞定 UIViewContentMo ...

  7. 我的iOS开发系列博文

    之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...

  8. fir.im Weekly - 94 个 iOS 开发资源推荐

    距离 2016 年还有 17 个日夜,而你和回家只隔了一张 12306 验证码的距离,祝大家抢票顺利.本期 fir.im Weekly 收集了一些优秀的 GitHub 源码.开发工具和动画特效,希望对 ...

  9. Android ImageView图片透明区域不响应点击事件,不规则图片透明区域响应点击事件

    转载:http://blog.csdn.net/aminfo/article/details/7872681 经常会在项目中用到透明图片,不规则图片,特别是做游戏的时候,需要对图片的透明区域的点击事件 ...

随机推荐

  1. spark 加载文件

    spark 加载文件 textFile的参数是一个path,这个path可以是: 1. 一个文件路径,这时候只装载指定的文件 2. 一个目录路径,这时候只装载指定目录下面的所有文件(不包括子目录下面的 ...

  2. ci重定向

    ci重定向 对于/index.php/abc这种url,Apache和lighttpd会按"index.php?abc"来解释,而nginx会认为是请求名字是"index ...

  3. 9月19日上午JavaScript数组

    数组 一.定义 1.数组的文字定义 广义上说,数组是相同类型数据的集合.但是对于强类型语言和弱类型语言来说其特点是不一样的.强类型语言数组和集合有以下特点. 数组强类型语言:1.数组里面只能存放相同数 ...

  4. HTML教程

    HTML文档可以包含的内容 通过不同的标签,HTML文档可以包含不同的内容,比如文本,链接,图片,列表,表格,表单,框架等. 文本 HTML对文本的支持是最丰富的,你可以设置不同级别的标题,分段和换行 ...

  5. ubuntu下安装TexLive和Texmaker

    也可以参考ubuntu14.04配置中文latex完美环境(texlive+texmaker+lyx) 设置中文字体的时候参考ubuntu 下安装 texlive 并设置 ctex 中文套装 1.首先 ...

  6. JavaWeb学习笔记——DAO设计模式

  7. lazyload.js实现图片异步载入

    所谓图片异步加载,意思是不用一次把图片全部加载完,你可以叫它延迟加载,缓冲加载都行. 看看你有没有这种需求:某篇文章图片很多,如果在载入文章时就载入所有图片,无疑会延缓载入速度,让用户等更久,所以,我 ...

  8. input disabled 表单禁用

    启用 <input type="> 禁用 <input type=" disabled="">

  9. 单元测试写cookie

    我们在开发WEB项目的时候,一般应用逻辑跟ASPX页面是分离的项目.应用逻辑一般会是一个DLL组件项目.如果这个组件项目中A方法使用了Session.Cookie等信息的读写,则这个方法就很难写单元测 ...

  10. xheditor编辑器的使用

    xheditor编辑器的使用 一个博客.cms网站都一定会用到一个html编辑器,刚好xmfdsh在做网站时候需要用到这类编辑器,在对比了之后,发现其实差不了多少,刚好一个不错的friend在用xhe ...