IOS 中CALayer绘制图片的实例详解

IOS 中CALayer绘制图片的实例详解

CALayer渲染内容图层。与UIImageView相比,不具有事件响应功能,且UIImageView是管理内容。

注意事项:如何使用delegate对象执行代理方法进行绘制,切记需要将delegate设置为nil,否则会导致异常crash。

CALayer绘制图片与线条效果图:

代码示例:

CGPoint position = CGPointMake(160.0, 200.0);
CGRect bounds = CGRectMake(0.0, 0.0, 150.0, 150.0);
CGFloat cornerRadius = 150.0 / 2;
CGFloat borderWidth = 2.0;
// 阴影层
CALayer *layerShadow = [[CALayer alloc] init];
layerShadow.position = position;
layerShadow.bounds = bounds;
layerShadow.cornerRadius = cornerRadius;
layerShadow.borderWidth = borderWidth;
layerShadow.borderColor = [UIColor whiteColor].CGColor;
layerShadow.shadowColor = [UIColor grayColor].CGColor;
layerShadow.shadowOffset = CGSizeMake(2.0, 1.0);
layerShadow.shadowOpacity = 1.0;
layerShadow.shadowRadius = 3.0;
[self.view.layer addSublayer:layerShadow];
// 容器层
CALayer *layerContant = [[CALayer alloc] init];
// 添加到父图层
[self.view.layer addSublayer:layerContant];
// 图层中心点、大小(中心点和大小构成frame)
layerContant.position = position;
layerContant.bounds = bounds;
// 图层背景颜色
layerContant.backgroundColor = [UIColor redColor].CGColor;
// 图层圆角半径
layerContant.cornerRadius = cornerRadius;
// 图层蒙版、子图层是否剪切图层边界
//  layerContant.mask = nil;
layerContant.masksToBounds = YES;
// 边框宽度、颜色
layerContant.borderWidth = borderWidth;
layerContant.borderColor = [UIColor whiteColor].CGColor;
// 阴影颜色、偏移量、透明度、形状、模糊半径
//  layerContant.shadowColor = [UIColor grayColor].CGColor;
//  layerContant.shadowOffset = CGSizeMake(2.0, 1.0);
//  layerContant.shadowOpacity = 1.0;
//  CGMutablePathRef path = CGPathCreateMutable();
//  layerContant.shadowPath = path;
//  layerContant.shadowRadius = 3.0;
// 图层透明度
layerContant.opacity = 1.0;
// 绘制图片显示方法1
// 图层形变
// 旋转(angle转换弧度:弧度=角度*M_PI/180;x上下对换、y左右对换、z先上下对换再左右对换;-1.0~1.0)
//  layerContant.transform = CATransform3DMakeRotation(M_PI, 0.0, 0.0, 0.0);
// 缩放(0.0~1.0)
//  layerContant.transform = CATransform3DMakeScale(0.8, 0.8, 0.8);
// 移动
//  layerContant.transform = CATransform3DMakeTranslation(10.0, 1.0, 1.0);
// 显示内容
 [layerContant setContents:[UIImage imageNamed:@"header"].CGImage];

绘制图片显示方法2

layerContant.delegate = self;
[layerContant setNeedsDisplay]; 

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
  // 绘图
  CGContextSaveGState(ctx);
  // 图形上下文形变,避免图片倒立显示
  CGContextScaleCTM(ctx, 1.0, -1.0);
  CGContextTranslateCTM(ctx, 0.0, -150.0);
  // 图片
  UIImage *image = [UIImage imageNamed:@"header"];
  CGContextDrawImage(ctx, CGRectMake(0.0, 0.0, 150.0, 150.0), image.CGImage);
  CGContextRestoreGState(cox);
}

// 绘制实线、虚线
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
  // 绘实线
  // 线条宽
  CGContextSetLineWidth(ctx, 1.0);
  // 线条颜色
//  CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);
  CGContextSetStrokeColorWithColor(ctx, [UIColor greenColor].CGColor);
  // 方法1
  // 坐标点数组
  CGPoint aPoints[2];
  aPoints[0] = CGPointMake(10.0, 50.0);
  aPoints[1] = CGPointMake(140.0, 50.0);
  // 添加线 points[]坐标数组,和count大小
  CGContextAddLines(ctx, aPoints, 2);
  // 根据坐标绘制路径
  CGContextDrawPath(ctx, kCGPathStroke);
  // 方法2
  CGContextSetLineWidth(ctx, 5.0);
  CGContextSetStrokeColorWithColor(ctx, [UIColor purpleColor].CGColor);
  CGContextMoveToPoint(ctx, 10.0, 60.0); // 起点坐标
  CGContextAddLineToPoint(ctx, 140.0, 60.0); // 终点坐标
  CGContextStrokePath(ctx); // 绘制路径 

  // 绘虚线
  // 线条宽
  CGContextSetLineWidth(ctx, 2.0);
  // 线条颜色
  CGContextSetStrokeColorWithColor(ctx, [UIColor blueColor].CGColor);
  // 虚线
  CGFloat dashArray[] = {1, 1, 1, 1};
  CGContextSetLineDash(ctx, 1, dashArray, 1);
  // 起点
  CGContextMoveToPoint(ctx, 10.0, 100.0);
  // 终点
  CGContextAddLineToPoint(ctx, 140.0, 100.0);
  // 绘制路径
  CGContextStrokePath(ctx);
}
// 内存管理,避免异常crash
- (void)dealloc
{
  for (CALayer *layer in self.view.layer.sublayers)
  {
    if ([layer.delegate isEqual:self])
    {
      layer.delegate = nil;
    }
  }
  NSLog(@"%@ 被释放了~", self);
}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • iOS开发中CAlayer层的属性以及自定义层的方法

    CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) @property CGPoint anchorPoint; 称为"定位点"."锚点" 决定着CALayer身上的哪个点会在position属性所指的位置 以自己的左上角为原点(0

  • iOS开发中CALayer使用的基本教程

    一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层 @property(nonatomic,readonly,retain) CALayer *layer; 当UIView需要显示到屏幕上时,会调用

  • iOS利用CALayer实现动画加载的效果

    首先来看看效果图 实现过程如下 控制器调用就一句代码: [self showLoadingInView:self.view]; 方便控制器如此调用,就要为控制器添加一个分类 .h文件 #import <UIKit/UIKit.h> #import "GQCircleLoadView.h" @interface UIViewController (GQCircleLoad) //显示动画 - (void)showLoadingInView:(UIView*)view; //隐

  • IOS 中CALayer绘制图片的实例详解

    IOS 中CALayer绘制图片的实例详解 CALayer渲染内容图层.与UIImageView相比,不具有事件响应功能,且UIImageView是管理内容. 注意事项:如何使用delegate对象执行代理方法进行绘制,切记需要将delegate设置为nil,否则会导致异常crash. CALayer绘制图片与线条效果图: 代码示例: CGPoint position = CGPointMake(160.0, 200.0); CGRect bounds = CGRectMake(0.0, 0.0

  • IOS 中KVC的使用方法实例详解

    IOS 中KVC的使用方法实例详解 KVC是Key Value Coding的缩写,意思是键值编码.在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象的属性方法.说的有的拗口,实际上就是通过类定义我们可以看到类的各种属性,那么使用属性的名称我们就能访问到类实例化后的对象的这个属性值. 这个方法可以不通过getter/setter方法来访问对象的属性.因为一个类的成员变量如果没有提供getter/setter的话,外界就失去了对这个变量的访问渠道.而KVC则提供了一种访问的

  • iOS中如何使用iconfont图标实例详解

    1.什么是iconfont iconFont拆开来看,就是 Icon + Font,这样估计大家应该都能理解是什么,那两者结合是什么呢?没错!就是 IconFont !让开发者像使用字体一样使用图标.如果自己不会做的话,可以直接去阿里的iconfont图标库下载自己需要的图标. 2.为什么要使用iconfont 在开发项目时,不可避免的会用到各种图标,为了适配不同的设备,通常需要@2x和@3x两套图,例如说我们tabBar上使用的图标.有些app有换肤的需要,还需要多套不同的图来进行匹配不同的主

  • IOS 调整内存中的图片大小实例详解

    IOS 调整内存中的图片大小实例详解 在从网路download图片,或者从相册读取图片的时候,如果ImageView的本身就是固定的300*200,那么载入2000*2000的图片是很浪费内存的. 2000*2000的内存占用是2000*2000*4bit 以下两个函数可以用来创建一个新的按照固定大小的图片.简单来说,就是Core Graphics来创建一个bitmap,然后生成一个图片. - (UIImage*)imageWithImage:(UIImage*)image scaledToSi

  • IOS 绘制三角形的实例详解

    IOS 绘制三角形的实例详解 先上效果图 上面三角形的代码 - (void)ljTestView { CGPoint piont1; piont1.x = 170; piont1.y = 100; CGPoint piont2; piont2.x = 50; piont2.y = 200; CGPoint piont3; piont3.x = 220; piont3.y = 200; ljDrawRect *_ljView = [[ljDrawRect alloc]initStartPoint:

  • 使用Swift代码实现iOS手势解锁、指纹解锁实例详解

    一.手势密码 1. 1.1.用UIButton组成手势的节点. 1.2.当手指接触屏幕时,调用重写的 touchesBegan:withEvent方法(在touchesBegan里调用setNeedsDisplay,这样就会自动调用drawRect方法). 1.3.当手指在屏幕上滑动时,调用重写的touchesEnded:withEvent方法. 这两个方法执行的操作是一样的:通过locationInView获取 触摸的坐标,然后用 CGRectContainsPoint 判断手指是否经过UIB

  • IOS UIView的生命周期的实例详解

    IOS UIView的生命周期的实例详解 任何对象的者有一个生命周期,即都存在一个实例化到销毁的过程. UIView对象也不例外,那么UIView从init/new开始后,直到dealloc结束的过程中都经历了哪些过程呢? 首先自定义继承自UIView的对象LifeView #import <UIKit/UIKit.h> @interface LifeView : UIView @end #import "LifeView.h" @interface LifeView ()

  • IOS 开发之Swift 元组的实例详解

    IOS 开发之Swift 元组的实例详解 元组是多个值组合而成的复合值.元组中的值可以是任意类型,而且每一个元素的类型可以是不同的. 元组声明 //普通声明 var point = (5,2) var httpResponse = (404, "Not Found") //定义类型声明 var point2 : (Int,Int,Int) = (10,5,2) var httpResponse2 : (Int,String) = (200,"ok") 元组解包 va

  • php生成条形码的图片的实例详解

    php生成条形码的图片的实例详解 因为用户的需要  写了一个条形码:用php生成一个条形码的图片  这个大家应该比我要好很多的吧,在自己项目的根目录下建立一个测试文件(直接把下面的代码放进去运行一下看看,我也是抄袭别人的),在实际的项目中你可以将下面的代码封装到一个公共类文件下的一个函数,然后调用. class testinfo{ function UPCAbarcode($code) { $trans_code = $code; $lw = 2.2; $hi = 40; $Lencode =

  • JSP 获取本地图片的实例详解

    JSP 获取本地图片的实例详解 IE当前7以上版本不支持直接在src上写本地硬盘地址来显示图片.因为我们只有通过后台在response中读到二进制流的方式来在前台显示图片. 具体代码如下: public void showPicture(){ String id = ServletActionContext.getRequest().getParameter("id");//前台传来的存图片路径实体类的主键id HttpServletResponse response = Servle

随机推荐