【iOS开发每日小笔记(十)】自制带圆框的头像 利用在CALayer设置“寄宿图”

这篇文章是我的【iOS开发每日小笔记】系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧。它们可能会给用户体验、代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下。90%的作用是帮助自己回顾、记忆、复习。

在上一篇文章中,我详细地回顾、复习了Core Graphics框架中利用Quartz 2D来绘制各种各样的图形,其实这些绘图就是绘制到了UIView的CALayer层上。这次,受到另一篇博文(http://www.cnblogs.com/kenshincui/p/3972100.html)的启发,我利用在CALayer层上设置“寄宿图”,重新优化了自己项目中的一个小控件。本篇文章将介绍在CALayer层上设置“寄宿图”。(demo地址:https://github.com/pigpigdaddy/CircleHeadViewDemo

效果是这样的:用户的头像不再是一个矩形,而是一个有这白色边框,带边框阴影的圆形。类似的效果比如“唱吧”、“QQ”。

          

下面是我自己写的效果:(带有一点点阴影。)

以前,我们使用一个讨巧的方法,那就是让UI组给我们切一个“中间镂空”的图片,蒙在UIImageView(我们的头像)上面。这样做挺讨巧,但是水平未免也太低了,而且灵活度非常低。“边宽”、“边颜色”、“阴影”,要改变这些只能麻烦UI组的同学重新切图。总之非常不科学。

因此来看看我自己写的一个很简单的类,解决这些问题:(demo地址:https://github.com/pigpigdaddy/CircleHeadViewDemo

用于处理照片的类:

 1 //
 2 //  CircleHeadView.h
 3 //  CircleHeadViewDemo
 4 //
 5 //  Created by pigpigdaddy on 14-9-24.
 6 //  Copyright (c) 2014年 pigpigdaddy. All rights reserved.
 7 //
 8
 9 #import <UIKit/UIKit.h>
10
11 typedef enum {
12     CircleHeadViewContentResize,
13     CircleHeadViewContentResizeAspect,
14     CircleHeadViewContentResizeAspectFill
15 } CircleHeadViewContentType;
16
17 @interface CircleHeadView : UIView
18
19 @property (nonatomic, strong)UIColor *strokeColor;
20 @property (nonatomic, assign)CGFloat strokeWidth;
21 @property (nonatomic, strong)UIImage *originalImage;
22 @property (nonatomic, assign)BOOL needShadow;
23 @property (nonatomic, assign)CircleHeadViewContentType contentType;
24
25 - (void)setCircleImage:(UIImage *)image;
26
27 @end
 1 //
 2 //  CircleHeadView.m
 3 //  CircleHeadViewDemo
 4 //
 5 //  Created by pigpigdaddy on 14-9-24.
 6 //  Copyright (c) 2014年 pigpigdaddy. All rights reserved.
 7 //
 8
 9 #import "CircleHeadView.h"
10
11 @implementation CircleHeadView
12
13 - (id)initWithFrame:(CGRect)frame
14 {
15     self = [super initWithFrame:frame];
16     if (self) {
17         // Initialization code
18         // 设置默认值
19         self.needShadow = NO;
20         self.strokeColor = [UIColor whiteColor];
21         self.strokeWidth = 2.0;
22         self.contentType = CircleHeadViewContentResize;
23     }
24     return self;
25 }
26
27 // 设置原始图片
28 - (void)setCircleImage:(UIImage *)image
29 {
30     self.originalImage = image;
31
32     // 正圆形
33     CGRect bounds=CGRectMake(0, 0, self.bounds.size.height, self.bounds.size.height);
34     CGFloat cornerRadius=self.bounds.size.height/2;
35
36     if (self.needShadow) {
37         // 创建阴影层
38         [self createShadowLayer:bounds cornerRadius:cornerRadius];
39     }
40     // 创建照片层
41     [self createImageLayer:bounds cornerRadius:cornerRadius];
42 }
43
44 - (void)createShadowLayer:(CGRect)bounds cornerRadius:(CGFloat)cornerRadius
45 {
46     CALayer *layerShadow=[[CALayer alloc]init];
47     layerShadow.bounds=bounds;
48     layerShadow.position=CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
49     layerShadow.cornerRadius=cornerRadius;
50     layerShadow.shadowColor=[UIColor grayColor].CGColor;
51     layerShadow.shadowOffset=CGSizeMake(2, 2);
52     layerShadow.shadowOpacity=0.7;
53     layerShadow.borderColor=self.strokeColor.CGColor;
54     layerShadow.borderWidth=self.strokeWidth;
55     [self.layer addSublayer:layerShadow];
56 }
57
58 - (void)createImageLayer:(CGRect)bounds cornerRadius:(CGFloat)cornerRadius
59 {
60     CALayer *layer=[[CALayer alloc]init];
61     layer.bounds=bounds;
62     layer.position=CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
63     layer.backgroundColor=[UIColor blackColor].CGColor;
64     layer.cornerRadius=cornerRadius;
65     layer.masksToBounds=YES;
66     layer.borderColor=self.strokeColor.CGColor;
67     layer.borderWidth=self.strokeWidth;
68     layer.contents=(id)self.originalImage.CGImage;
69     [self.layer addSublayer:layer];
70
71     // 设置照片的平铺方式
72     switch (self.contentType) {
73         case CircleHeadViewContentResize:
74         {
75             layer.contentsGravity = kCAGravityResize;
76         }
77             break;
78         case CircleHeadViewContentResizeAspect:
79         {
80             layer.contentsGravity = kCAGravityResizeAspect;
81         }
82             break;
83         case CircleHeadViewContentResizeAspectFill:
84         {
85             layer.contentsGravity = kCAGravityResizeAspectFill;
86         }
87             break;
88
89         default:
90             break;
91     }
92 }
93
94 @end

我用了两个CALayer层,来分别绘制“阴影”和“照片”。

调用方法:

1     CircleHeadView *view = [[CircleHeadView alloc] initWithFrame:CGRectMake(50, 50, 80, 80)];
2     view.needShadow = YES;
3     view.strokeWidth = 2.0;
4     view.strokeColor = [UIColor whiteColor];
5     view.contentType = CircleHeadViewContentResizeAspectFill;
6     [view setCircleImage:[UIImage imageNamed:@"photo.png"]];
7     [self.view addSubview:view];

很简单,也很灵活,可以设置“阴影”、“边宽”、“边颜色”、“平铺类型”。其实还可以设置的更多,因为CALayer可以自定义的东西有很多。在此就不一一扩展了。

(demo地址:https://github.com/pigpigdaddy/CircleHeadViewDemo

参考文章:

http://www.cnblogs.com/kenshincui/p/3972100.html

时间: 2024-12-09 18:08:39

【iOS开发每日小笔记(十)】自制带圆框的头像 利用在CALayer设置“寄宿图”的相关文章

【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.90%的作用是帮助自己回顾.记忆.复习. 测试组的小伙伴们大显神威,iOS8刚发布,他们就把测试设备急速升级了,然后就是扑面而来的各种bug和他们各种幸灾乐祸的笑.没办法,老老实实修复bug! 来看看今天我遇到的一个问题: 项目中,我将一个简化的H

转:【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber

http://www.bubuko.com/infodetail-382485.html 这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.90%的作用是帮助自己回顾.记忆.复习. 测试组的小伙伴们大显神威,iOS8刚发布,他们就把测试设备急速升级了,然后就是扑面而来的各种bug和他们各种幸灾乐祸

【iOS开发每日小笔记(十二)】仿Facebook登录界面 错误提示抖动 利用CAAnimation设置动画效果

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.90%的作用是帮助自己回顾.记忆.复习. 原本以为国庆假期可以有时间看看书,写写博客.实际上大部分时间都被赶场参加婚礼和到处去亲戚家串门吃饭所占用.眼看明天还剩最后一天时间,今天赶紧来更新一篇,也算是没有完全荒废这7天长假吧! Facebook的客

【iOS开发每日小笔记(四)】iOS 7中如何除去UIAlertView 规避delegate对象销毁后接收消息的crash

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论

【iOS开发每日小笔记(九)】在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习. 一直想写一篇关于runloop学习有所得的文章,总是没有很好的例子.正巧自己的上线App Store的小游戏<跑酷好基友>(https://itunes.apple.com/us/app/pao-k

【iOS开发每日小笔记(五)】实测copy到底是个神马玩意

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论

【iOS开发每日小笔记(一)】UIPickerView 自动选择某个component的某个row

从这篇文章开始我将会把每天在开发过程中遇到的,可以用很短的文章.很小的demo演示解释出来的小心得小技巧,分享在[iOS开发每日小笔记]这个分类中.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们会给用户体验.代码效率得到一些提升,记录在这里,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,可以选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论里狠狠吐槽,再关掉页面!感谢! 今天在项目中遇到这样一个小问题:我使用UI

【iOS开发每日小笔记(十三)】使用UIDocumentInteractionController 打开ibooks文档的注意点

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.90%的作用是帮助自己回顾.记忆.复习. 大约两年多前,我曾尝试自己写一个程序,用来解析Word文档.当时满腔热血,认为只要是把xml各种标签一一对应解析就好了(当时还不知道有CoreText这档子东西).后来发现自己实力不够,在解析了图片.文字.

【iOS开发每日小笔记(三)】利用iOS7 UIKit Dynamics 仿Zaker客户端首页动态效果

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下(^_^).其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在