效果如下:

KMLayerDelegate.h

 #import <UIKit/UIKit.h>

 @interface KMLayerDelegate : NSObject

 @end

KMLayerDelegate.m

 #import "KMLayerDelegate.h"

 @implementation KMLayerDelegate

 /**
* 根据角度,获取对应的弧度
*
* @param degree 角度
*
* @return 对应的弧度
*/
static inline double radian(double degree) {
return degree * M_PI/;
} /**
* 绘画着色模式内容;绘画预定宽高大小的单元格,每个单元格包含两个半圆,分别为『左上角的上半圆』和『右下边的下半圆』
*
* @param info 信息
* @param context 上下文
*/
void drawColoredPattern(void *info, CGContextRef context) {
CGColorRef dotColor = [UIColor colorWithHue:0.0 saturation:0.0 brightness:0.0 alpha:0.8].CGColor; //圆点颜色;以色彩、饱和度、亮度和不透明度组合的颜色
CGColorRef dotShadowColor = [UIColor orangeColor].CGColor; //圆点阴影颜色 CGContextSetFillColorWithColor(context, dotColor); //设置填充色
CGContextSetShadowWithColor(context, CGSizeMake(2.0, 2.0), , dotShadowColor); //设置阴影颜色;以阴影位置偏差为(2.0, 2.0)、模糊效果的 dotShadowColor 作为阴影颜色 CGContextAddArc(context, 10.0, 10.0, 10.0, 0.0, radian(180.0), ); //添加圆点;以居中点为(10.0, 10.0)、半径为10.0、顺时针画0.0到180.0弧度的圆点(即为上半圆),注意0.0弧度为水平线左边位置开始
CGContextFillPath(context); CGContextAddArc(context, 30.0, 20.0, 10.0, 0.0, radian(180.0), ); //添加圆点;以居中点为(30.0, 20.0)、半径为10.0、逆时针画0.0到180.0弧度的圆点(即为下半圆),注意0.0弧度为水平线左边位置开始
CGContextFillPath(context);
} /**
* 绘画内容图层
*
* @param layer 当前图层
* @param context 上下文
*/
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context {
//图层背景颜色
CGColorRef backgroundColor = [UIColor lightGrayColor].CGColor;
CGContextSetFillColorWithColor(context, backgroundColor);
CGContextFillRect(context, layer.bounds); static const CGPatternCallbacks callbacks = { , &drawColoredPattern, NULL };
//绘画连续的单元格,每个单元格的内容由 drawColoredPattern 方法决定
CGContextSaveGState(context);
CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL);
CGContextSetFillColorSpace(context, patternSpace);
CGColorSpaceRelease(patternSpace); CGPatternRef pattern = CGPatternCreate(NULL,
layer.bounds,
CGAffineTransformIdentity,
40.0, //单元格的宽度
40.0, //单元格的高度
kCGPatternTilingConstantSpacing,
true,
&callbacks);
CGFloat alpha = 1.0; //着色模式内容的不透明度
CGContextSetFillPattern(context, pattern, &alpha);
CGPatternRelease(pattern);
CGContextFillRect(context, layer.bounds);
CGContextRestoreGState(context);
} @end

ViewController.h

 //#import <UIKit/UIKit.h>
#import <QuartzCore/CALayer.h>
#import "KMLayerDelegate.h" @interface ViewController : UIViewController
@property (strong, nonatomic) KMLayerDelegate *layerDelegate; @end

ViewController.m

 #import "ViewController.h"

 static CGFloat const kCornerRadius = 10.0;
static CGFloat const kWidthOfIcon = 120.0;
static CGFloat const kLineWidth = 5.0;
static CGFloat const kBaseNumber = ; ///< 24等分法 @interface ViewController ()
- (void)createShadowCornerImage:(UIImage *)image withRootLayer:(CALayer *)rootLayer;
- (void)createCustomDrawingLayer:(CALayer *)rootLayer;
- (void)createSuccessIconDrawingLayer:(CALayer *)rootLayer;
- (void)createWarningIconDrawingLayer:(CALayer *)rootLayer;
- (void)createErrorIconDrawingLayer:(CALayer *)rootLayer;
- (void)layoutUI;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; [self layoutUI];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} /**
* 创建带阴影效果的圆角图片图层
*
* @param image 图片
* @param rootLayer 根图层
*/
- (void)createShadowCornerImage:(UIImage *)image withRootLayer:(CALayer *)rootLayer {
// 子图层(图片的阴影图层)
CALayer *subLayer = [CALayer layer];
subLayer.frame = CGRectMake(20.0, 40.0, 150.0, 150.0);
subLayer.backgroundColor = [UIColor lightGrayColor].CGColor;
subLayer.cornerRadius = kCornerRadius;
subLayer.borderColor = [UIColor blackColor].CGColor;
subLayer.borderWidth = 2.0;
subLayer.shadowColor = [UIColor blackColor].CGColor; // 设置阴影颜色
subLayer.shadowOpacity = 0.7; // 设置阴影不透明度
subLayer.shadowOffset = CGSizeMake(4.0, 3.0); // 设置阴影位置偏差
subLayer.shadowRadius = 5.0; // 设置阴影圆角半径
[rootLayer addSublayer:subLayer]; // 子图层的子图层(图片的内容图层)
CALayer *imageLayer = [CALayer layer];
imageLayer.frame = subLayer.bounds;
imageLayer.contents = (id)image.CGImage;
imageLayer.masksToBounds = YES; // 设置标示剪切界限;内容图层需设置为 YES,才能有圆角效果
imageLayer.cornerRadius = kCornerRadius;
CGAffineTransform affineTransform = CGAffineTransformConcat(CGAffineTransformMakeScale(0.8, 0.8), CGAffineTransformMakeRotation(M_PI_4/)); // 合并缩放和旋转效果;以0.8比例居中缩放,以45度/9=5度的角度顺时针旋转
imageLayer.affineTransform = affineTransform;
[subLayer addSublayer:imageLayer];
} /**
* 创建自定义绘画内容图层(KMLayerDelegate)
*
* @param rootLayer 根图层
*/
- (void)createCustomDrawingLayer:(CALayer *)rootLayer {
CALayer *drawingLayer = [CALayer layer];
drawingLayer.frame = CGRectMake(200.0, 40.0, 150.0, 150.0);
drawingLayer.backgroundColor = [UIColor orangeColor].CGColor; // 背景颜色会被内容图层遮住,所以最终呈现的以内容图层为准
drawingLayer.masksToBounds = YES; // 设置标示剪切界限;内容图层需设置为 YES,才能有圆角效果
drawingLayer.cornerRadius = kCornerRadius;
drawingLayer.borderColor = [UIColor blackColor].CGColor;
drawingLayer.borderWidth = 2.0;
drawingLayer.shadowColor = [UIColor darkGrayColor].CGColor; // 设置阴影颜色
drawingLayer.shadowOpacity = 0.8; // 设置阴影不透明度
drawingLayer.shadowOffset = CGSizeMake(8.0, 6.0); // 设置阴影位置偏差
drawingLayer.shadowRadius = 5.0; // 设置阴影圆角半径 _layerDelegate = [KMLayerDelegate new];
drawingLayer.delegate = _layerDelegate;
[drawingLayer setNeedsDisplay]; // 这里必须调用方法 setNeedsDisplay,才会触发委托代理方法 drawLayer:
[rootLayer addSublayer:drawingLayer];
} /**
* 创建绿色成功图标内容图层
*
* @param rootLayer 根图层
*/
- (void)createSuccessIconDrawingLayer:(CALayer *)rootLayer {
// 成功图标颜色:绿色
UIColor *const color = [UIColor colorWithRed:0.000 green:1.000 blue:0.502 alpha:1.000]; // 贝塞尔曲线路径;开始画圆
UIBezierPath* path = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0.0, 0.0, kWidthOfIcon, kWidthOfIcon)];
// 然后以三点形成「打勾」效果
[path moveToPoint:CGPointMake(kWidthOfIcon/kBaseNumber*, kWidthOfIcon/kBaseNumber*)];
CGPoint p1 = CGPointMake(kWidthOfIcon/kBaseNumber*, kWidthOfIcon/kBaseNumber*);
[path addLineToPoint:p1]; CGPoint p2 = CGPointMake(kWidthOfIcon/kBaseNumber*, kWidthOfIcon/kBaseNumber*);
[path addLineToPoint:p2]; // 子图层
CAShapeLayer *subLayer = [CAShapeLayer layer];
subLayer.frame = CGRectMake(125.0, 210.0, kWidthOfIcon, kWidthOfIcon);
subLayer.path = path.CGPath;
subLayer.lineWidth = kLineWidth; // 线条宽度
subLayer.strokeColor = color.CGColor; // 线条颜色
subLayer.fillColor = [UIColor clearColor].CGColor; //清除填充色
[rootLayer addSublayer:subLayer];
} /**
* 创建黄色警告图标内容图层
*
* @param rootLayer 根图层
*/
- (void)createWarningIconDrawingLayer:(CALayer *)rootLayer {
CGFloat centerOfWidth = (kWidthOfIcon - kLineWidth)/;
// 警告图标颜色:黄色
UIColor *const color = [UIColor colorWithRed:1.000 green:0.800 blue:0.400 alpha:1.000]; // 贝塞尔曲线路径;开始画圆
UIBezierPath* path = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0.0, 0.0, kWidthOfIcon, kWidthOfIcon)];
// 然后画感叹号
[path moveToPoint:CGPointMake(centerOfWidth, kWidthOfIcon/kBaseNumber*)];
CGPoint p1 = CGPointMake(centerOfWidth, kWidthOfIcon/kBaseNumber*);
[path addLineToPoint:p1]; [path moveToPoint:CGPointMake(centerOfWidth, kWidthOfIcon/kBaseNumber*)];
[path addArcWithCenter:CGPointMake(centerOfWidth, kWidthOfIcon/kBaseNumber*) radius:3.0 startAngle: endAngle:M_PI* clockwise:YES]; // 子图层
CAShapeLayer *subLayer = [CAShapeLayer layer];
subLayer.frame = CGRectMake(125.0, 360.0, kWidthOfIcon, kWidthOfIcon);
subLayer.path = path.CGPath;
subLayer.lineWidth = kLineWidth; // 线条宽度
subLayer.strokeColor = color.CGColor; // 线条颜色
subLayer.fillColor = [UIColor clearColor].CGColor; //清除填充色
[rootLayer addSublayer:subLayer];
} /**
* 创建红色错误图标内容图层
*
* @param rootLayer 根图层
*/
- (void)createErrorIconDrawingLayer:(CALayer *)rootLayer {
CGFloat keyVal1 = kWidthOfIcon/kBaseNumber*;
CGFloat keyVal2 = kWidthOfIcon/kBaseNumber*;
// 失败图标颜色:红色
UIColor *const color = [UIColor colorWithRed:1.000 green:0.400 blue:0.400 alpha:1.000]; // 贝塞尔曲线路径;开始画圆
UIBezierPath* path = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0.0, 0.0, kWidthOfIcon, kWidthOfIcon)];
// 然后画交叉号
CGPoint p1 = CGPointMake(keyVal1, keyVal1);
[path moveToPoint:p1]; CGPoint p2 = CGPointMake(keyVal2, keyVal2);
[path addLineToPoint:p2]; CGPoint p3 = CGPointMake(keyVal2, keyVal1);
[path moveToPoint:p3]; CGPoint p4 = CGPointMake(keyVal1, keyVal2);
[path addLineToPoint:p4]; // 子图层
CAShapeLayer *subLayer = [CAShapeLayer layer];
subLayer.frame = CGRectMake(125.0, 510.0, kWidthOfIcon, kWidthOfIcon);
subLayer.path = path.CGPath;
subLayer.lineWidth = kLineWidth; // 线条宽度
subLayer.strokeColor = color.CGColor; // 线条颜色
subLayer.fillColor = [UIColor clearColor].CGColor; //清除填充色
[rootLayer addSublayer:subLayer];
} - (void)layoutUI {
//根图层
CALayer *rootLayer = self.view.layer;
rootLayer.backgroundColor = [UIColor colorWithRed:0.769 green:0.940 blue:0.943 alpha:1.000].CGColor;
rootLayer.cornerRadius = 40.0; [self createShadowCornerImage:[UIImage imageNamed:@"Emoticon_tusiji_icon2"]
withRootLayer:rootLayer];
[self createCustomDrawingLayer:rootLayer];
[self createSuccessIconDrawingLayer:rootLayer];
[self createWarningIconDrawingLayer:rootLayer];
[self createErrorIconDrawingLayer:rootLayer];
} @end

CALayer 知识:创建带阴影效果的圆角图片图层和创建自定义绘画内容图层的更多相关文章

  1. 自定义view实现圆角图片

    前两天想实现一个圆角图片的效果,通过网络搜索后找到一些答案.这里自己再记录一下,加深一下自己的认识和知识理解. 实现圆角图片的思路是自定义一个ImageView,然后通过Ondraw()重绘的功能,将 ...

  2. SQL语句(二)创建带主键和约束的数据表

    内容摘要 创建带主键和约束的表 创建带组合主键和外键的表 1. 创建带主键和约束的表 Student (学生表) CREATE TABLE Student ( sclass ) NOT NULL, - ...

  3. 【Android】 图片编辑:创建圆角图片

    创建圆角图片的方式大同小异,最简单的就是 9.png 美工做出来的就是.这种最省事直接设置就可以. 另外一种就是通过裁剪 这里的剪裁指的是依据原图我们自己生成一张新的bitmap,这个时候指定图片的目 ...

  4. Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能

    我们的Glide系列文章终于要进入收尾篇了.从我开始写这个系列的第一篇文章时,我就知道这会是一个很长的系列,只是没有想到竟然会写这么久. 在前面的六篇文章中,我们对Glide的方方面面都进行了学习,包 ...

  5. Android流行界面结构——Fragment通过ViewPager(带指示器)嵌套Fragment结构的创建方法详解

    原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6287213.html 当前Android流行界面结构的一种——Fragment通过ViewPage ...

  6. Android 圆形/圆角图片的方法

    Android 圆形/圆角图片的方法 眼下网上有非常多圆角图片的实例,Github上也有一些成熟的项目.之前做项目,为了稳定高效都是选用Github上的项目直接用.但这样的结束也是Android开发必 ...

  7. 安卓图片载入之使用universalimageloader载入圆形圆角图片

    前言 话说这universalimageloader载入图片对搞过2年安卓程序都是用烂了再熟悉只是了.就是安卓新手也是百度就会有一大堆东西出来,今天为什么这里还要讲使用universalimagelo ...

  8. RoundedBitmapDrawable生成圆角图片

    Bitmap src = BitmapFactory.decodeResource(getResources(), imageId); //获取Bitmap图片 RoundedBitmapDrawab ...

  9. Android Xfermode 实战 实现圆形、圆角图片

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42094215,本文出自:[张鸿洋的博客] 1.概述 其实这篇本来准备Androi ...

随机推荐

  1. [Go] 开发 go web 项目,踩到的一些“坑”

    注意:这些“坑”不是bug,只是自己当时没搞明白. 用到的框架为 Beego 1.字典 map 是“引用类型”,本身就是指针,作为参数传递时,直接传 map 变量名即可(不要传 map 变量指针). ...

  2. C# Redis缓存过期实现延迟通知实战演练

    一.场景描述 在实际开发过程中经常会遇到一些有时效性数据的业务场景,比如订单支付处理超时提醒.当用户在商城上进行下单支付,我们假设如果8小时没有进行支付,那么就后台自动对该笔交易的状态修改为订单关闭取 ...

  3. Log4j详细介绍(五)----输出地Appender

    Appender表示日志输出到什么地方,常用的输出地有控制台,文件,数据库,远程服务器等.Log4j中内置了常用的输出地,一般情况下配置一下即可使用.所有的Appender都实现自org.apache ...

  4. Openstack配置文件管理的变迁之路

    在管理一个Openstack集群时,如何维护配置文件无疑是其中最艰难和繁琐的任务之一.因为你不仅要面对众多的核心服务(nova,keystone,glance,cinder,etc)的配置文件,还需要 ...

  5. 【Mac使用系列】常用软件及快捷键

    Mac下配置ss: 下载地址:https://github.com/shadowsocks/shadowsocks-iOS/releases 旧版本:https://blog.csdn.net/vqh ...

  6. .net跨平台分析软件

    https://marketplace.visualstudio.com/items?itemName=ConnieYau.NETPortabilityAnalyzer

  7. oracle完全删除实例

    问题描述: 重建oracle库实例,因此要删除数据库实例 问题解决: 利用自用自带的dbca库管理,实现图形化删除实例  01.登录安装oracle数据库的linux 打开xshell企业版的Xman ...

  8. 玩魔兽争霸无故退出 提示框显示"0x21101663"指令引用的"0x02704acc"内存该存不能为"read" 确定就会终止程序

    20151002总结:下方法试过,没完全按照说的操作完,觉得有风险且那个read程序执行时间好长的,感觉有点干坏事的意思 ======================================= ...

  9. 关于tcp中time_wait状态的4个问题

    time_wait是个常问的问题.tcp网络编程中最不easy理解的也是它的time_wait状态,这也说明了tcp/ip四次挥手中time_wait状态的重要性. 以下通过4个问题来描写叙述它 问题 ...

  10. Atitit 大json文件的结构化查看解决方案,高性能的jsonview  attilax总结.docx

    Atitit 大json文件的结构化查看解决方案,高性能的jsonview  attilax总结.docx 1.1. 实现目标:1 1.2. 实现key与value类型的..一直分析到非 jsonob ...