查看: 291|回复: 0

[IOS开发教程] IOS 中CALayer绘制图片的实例详解

发表于 2017-11-11 10:39:54
太阳http代理AD

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

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

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

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

代码示例:

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

绘制图片显示方法2

  1. layerContant.delegate = self;
  2. [layerContant setNeedsDisplay];
  3. - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
  4. {
  5. // 绘图
  6. CGContextSaveGState(ctx);
  7. // 图形上下文形变,避免图片倒立显示
  8. CGContextScaleCTM(ctx, 1.0, -1.0);
  9. CGContextTranslateCTM(ctx, 0.0, -150.0);
  10. // 图片
  11. UIImage *image = [UIImage imageNamed:@"header"];
  12. CGContextDrawImage(ctx, CGRectMake(0.0, 0.0, 150.0, 150.0), image.CGImage);
  13. CGContextRestoreGState(cox);
  14. }
复制代码
  1. // 绘制实线、虚线
  2. - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
  3. {
  4. // 绘实线
  5. // 线条宽
  6. CGContextSetLineWidth(ctx, 1.0);
  7. // 线条颜色
  8. // CGContextSetRGBStrokeColor(ctx, 1.0, 0.0, 0.0, 1.0);
  9. CGContextSetStrokeColorWithColor(ctx, [UIColor greenColor].CGColor);
  10. // 方法1
  11. // 坐标点数组
  12. CGPoint aPoints[2];
  13. aPoints[0] = CGPointMake(10.0, 50.0);
  14. aPoints[1] = CGPointMake(140.0, 50.0);
  15. // 添加线 points[]坐标数组,和count大小
  16. CGContextAddLines(ctx, aPoints, 2);
  17. // 根据坐标绘制路径
  18. CGContextDrawPath(ctx, kCGPathStroke);
  19. // 方法2
  20. CGContextSetLineWidth(ctx, 5.0);
  21. CGContextSetStrokeColorWithColor(ctx, [UIColor purpleColor].CGColor);
  22. CGContextMoveToPoint(ctx, 10.0, 60.0); // 起点坐标
  23. CGContextAddLineToPoint(ctx, 140.0, 60.0); // 终点坐标
  24. CGContextStrokePath(ctx); // 绘制路径
  25. // 绘虚线
  26. // 线条宽
  27. CGContextSetLineWidth(ctx, 2.0);
  28. // 线条颜色
  29. CGContextSetStrokeColorWithColor(ctx, [UIColor blueColor].CGColor);
  30. // 虚线
  31. CGFloat dashArray[] = {1, 1, 1, 1};
  32. CGContextSetLineDash(ctx, 1, dashArray, 1);
  33. // 起点
  34. CGContextMoveToPoint(ctx, 10.0, 100.0);
  35. // 终点
  36. CGContextAddLineToPoint(ctx, 140.0, 100.0);
  37. // 绘制路径
  38. CGContextStrokePath(ctx);
  39. }
复制代码
  1. // 内存管理,避免异常crash
  2. - (void)dealloc
  3. {
  4. for (CALayer *layer in self.view.layer.sublayers)
  5. {
  6. if ([layer.delegate isEqual:self])
  7. {
  8. layer.delegate = nil;
  9. }
  10. }
  11. NSLog(@"%@ 被释放了~", self);
  12. }
复制代码

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



太阳http代理AD
回复

使用道具 举报