
效果如下:

KMLayerDelegate.h
1 #import <UIKit/UIKit.h> 2 3 @interface KMLayerDelegate : NSObject 4 5 @end
KMLayerDelegate.m
1 #import "KMLayerDelegate.h"
2
3 @implementation KMLayerDelegate
4
5 /**
6 * 根据角度,获取对应的弧度
7 *
8 * @param degree 角度
9 *
10 * @return 对应的弧度
11 */
12 static inline double radian(double degree) {
13 return degree * M_PI/180;
14 }
15
16 /**
17 * 绘画着色模式内容;绘画预定宽高大小的单元格,每个单元格包含两个半圆,分别为『左上角的上半圆』和『右下边的下半圆』
18 *
19 * @param info 信息
20 * @param context 上下文
21 */
22 void drawColoredPattern(void *info, CGContextRef context) {
23 CGColorRef dotColor = [UIColor colorWithHue:0.0 saturation:0.0 brightness:0.0 alpha:0.8].CGColor; //圆点颜色;以色彩、饱和度、亮度和不透明度组合的颜色
24 CGColorRef dotShadowColor = [UIColor orangeColor].CGColor; //圆点阴影颜色
25
26 CGContextSetFillColorWithColor(context, dotColor); //设置填充色
27 CGContextSetShadowWithColor(context, CGSizeMake(2.0, 2.0), 1, dotShadowColor); //设置阴影颜色;以阴影位置偏差为(2.0, 2.0)、模糊效果的 dotShadowColor 作为阴影颜色
28
29 CGContextAddArc(context, 10.0, 10.0, 10.0, 0.0, radian(180.0), 1); //添加圆点;以居中点为(10.0, 10.0)、半径为10.0、顺时针画0.0到180.0弧度的圆点(即为上半圆),注意0.0弧度为水平线左边位置开始
30 CGContextFillPath(context);
31
32 CGContextAddArc(context, 30.0, 20.0, 10.0, 0.0, radian(180.0), 0); //添加圆点;以居中点为(30.0, 20.0)、半径为10.0、逆时针画0.0到180.0弧度的圆点(即为下半圆),注意0.0弧度为水平线左边位置开始
33 CGContextFillPath(context);
34 }
35
36 /**
37 * 绘画内容图层
38 *
39 * @param layer 当前图层
40 * @param context 上下文
41 */
42 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context {
43 //图层背景颜色
44 CGColorRef backgroundColor = [UIColor lightGrayColor].CGColor;
45 CGContextSetFillColorWithColor(context, backgroundColor);
46 CGContextFillRect(context, layer.bounds);
47
48 static const CGPatternCallbacks callbacks = { 0, &drawColoredPattern, NULL };
49 //绘画连续的单元格,每个单元格的内容由 drawColoredPattern 方法决定
50 CGContextSaveGState(context);
51 CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL);
52 CGContextSetFillColorSpace(context, patternSpace);
53 CGColorSpaceRelease(patternSpace);
54
55 CGPatternRef pattern = CGPatternCreate(NULL,
56 layer.bounds,
57 CGAffineTransformIdentity,
58 40.0, //单元格的宽度
59 40.0, //单元格的高度
60 kCGPatternTilingConstantSpacing,
61 true,
62 &callbacks);
63 CGFloat alpha = 1.0; //着色模式内容的不透明度
64 CGContextSetFillPattern(context, pattern, &alpha);
65 CGPatternRelease(pattern);
66 CGContextFillRect(context, layer.bounds);
67 CGContextRestoreGState(context);
68 }
69
70 @end
ViewController.h
1 #import <UIKit/UIKit.h> 2 #import "KMLayerDelegate.h" 3 4 @interface ViewController : UIViewController 5 @PRoperty (strong, nonatomic) KMLayerDelegate *layerDelegate; 6 7 @end
ViewController.m
1 #import "ViewController.h"
2
3 static const CGFloat cornerRadius = 10.0;
4 @interface ViewController ()
5 - (void)createShadowCornerImage:(UIImage *)image withRootLayer:(CALayer *)rootLayer;
6 - (void)createCustomDrawingLayer:(CALayer *)rootLayer;
7 - (void)layoutUI;
8 @end
9
10 @implementation ViewController
11
12 - (void)viewDidLoad {
13 [super viewDidLoad];
14
15 [self layoutUI];
16 }
17
18 - (void)didReceiveMemoryWarning {
19 [super didReceiveMemoryWarning];
20 // Dispose of any resources that can be recreated.
21 }
22
23 /**
24 * 创建带阴影效果的圆角图片图层
25 *
26 * @param image 图片
27 * @param rootLayer 根图层
28 */
29 - (void)createShadowCornerImage:(UIImage *)image withRootLayer:(CALayer *)rootLayer {
30 //子图层(图片的阴影图层)
31 CALayer *subLayer = [CALayer layer];
32 subLayer.frame = CGRectMake(40.0, 40.0, 240.0, 240.0);
33 subLayer.backgroundColor = [UIColor lightGrayColor].CGColor;
34 subLayer.cornerRadius = cornerRadius;
35 subLayer.borderColor = [UIColor blackColor].CGColor;
36 subLayer.borderWidth = 2.0;
37 subLayer.shadowColor = [UIColor blackColor].CGColor; //设置阴影颜色
38 subLayer.shadowOpacity = 0.7; //设置阴影不透明度
39 subLayer.shadowOffset = CGSizeMake(4.0, 3.0); //设置阴影位置偏差
40 subLayer.shadowRadius = 5.0; //设置阴影圆角半径
41 [rootLayer addSublayer:subLayer];
42
43 //子图层的子图层(图片的内容图层)
44 CALayer *imageLayer = [CALayer layer];
45 imageLayer.frame = subLayer.bounds;
46 imageLayer.contents = (id)image.CGImage;
47 imageLayer.masksToBounds = YES; //设置标示剪切界限;内容图层需设置为 YES,才能有圆角效果
48 imageLayer.cornerRadius = cornerRadius;
49 CGAffineTransform affineTransform = CGAffineTransformConcat(CGAffineTransformMakeScale(0.8, 0.8), CGAffineTransformMakeRotation(M_PI_4/9)); //合并缩放和旋转效果;以0.8比例居中缩放,以45度/9=5度的角度顺时针旋转
50 imageLayer.affineTransform = affineTransform;
51 [subLayer addSublayer:imageLayer];
52 }
53
54 /**
55 * 创建自定义绘画内容图层
56 *
57 * @param rootLayer 根图层
58 */
59 - (void)createCustomDrawingLayer:(CALayer *)rootLayer {
60 CALayer *drawingLayer = [CALayer layer];
61 drawingLayer.frame = CGRectMake(40.0, 320.0, 240.0, 240.0);
62 drawingLayer.backgroundColor = [UIColor orangeColor].CGColor; //背景颜色会被内容图层遮住,所以最终呈现的以内容图层为准
63 drawingLayer.masksToBounds = YES; //设置标示剪切界限;内容图层需设置为 YES,才能有圆角效果
64 drawingLayer.cornerRadius = cornerRadius;
65 drawingLayer.borderColor = [UIColor blackColor].CGColor;
66 drawingLayer.borderWidth = 2.0;
67 drawingLayer.shadowColor = [UIColor darkGrayColor].CGColor; //设置阴影颜色
68 drawingLayer.shadowOpacity = 0.8; //设置阴影不透明度
69 drawingLayer.shadowOffset = CGSizeMake(8.0, 6.0); //设置阴影位置偏差
70 drawingLayer.shadowRadius = 5.0; //设置阴影圆角半径
71
72 _layerDelegate = [KMLayerDelegate new];
73 drawingLayer.delegate = _layerDelegate;
74 [drawingLayer setNeedsDisplay]; //这里必须调用方法 setNeedsDisplay,才会触发委托代理方法 drawLayer:
75 [rootLayer addSublayer:drawingLayer];
76 }
77
78 - (void)layoutUI {
79 //根图层
80 CALayer *rootLayer = self.view.layer;
81 rootLayer.backgroundColor = [UIColor cyanColor].CGColor;
82 rootLayer.cornerRadius = 40.0;
83
84 [self createShadowCornerImage:[UIImage imageNamed:@"Emoticon_tusiji_icon2"]
85 withRootLayer:rootLayer];
86 [self createCustomDrawingLayer:rootLayer];
87 }
88
89 @end