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