CAShapeLayer的使用[1]

使用CoreAnimation绘制动画带来的系统开销非常的小,CoreAnimation通常都是使用GPU的.

CAShapeLayer属于CoreAnimation中很重要的一种layer,无论是作为mask还是作为进度条显示都非常的好用,我用CAShapeLayer实现了如下复杂的效果.

  1. //
  2. // RootViewController.m
  3. //
  4. // Copyright (c) 2014年 Y.X. All rights reserved.
  5. //
  6.  
  7. #import "RootViewController.h"
  8. #import "UIImage+ImageEffects.h"
  9.  
  10. @interface RootViewController ()
  11.  
  12. @property (nonatomic, strong) UIView *showView;
  13. @property (nonatomic, strong) CAShapeLayer *oneReferenceLayer;
  14. @property (nonatomic, strong) CAShapeLayer *maskLayer;
  15.  
  16. @end
  17.  
  18. #define DEGREES(degrees) ((M_PI * (degrees))/ 180.f)
  19.  
  20. @implementation RootViewController
  21.  
  22. - (void)handlePan:(UIPanGestureRecognizer *)recognizer
  23. {
  24. // 拖拽
  25. CGPoint translation = [recognizer translationInView:self.view];
  26. recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
  27. recognizer.view.center.y + translation.y);
  28. [recognizer setTranslation:CGPointMake(, ) inView:self.view];
  29.  
  30. // 关闭CoreAnimation实时动画绘制(核心)
  31. [CATransaction setDisableActions:YES];
  32. _maskLayer.position = recognizer.view.center;
  33. }
  34.  
  35. - (void)viewDidLoad
  36. {
  37. [super viewDidLoad];
  38.  
  39. /* ====== 背景View ====== */
  40. UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
  41. imageView.image = [UIImage imageNamed:@"back"];
  42. [self.view addSubview:imageView];
  43.  
  44. /* ====== 作为mask的View ====== */
  45. _maskLayer = [CAShapeLayer layer];
  46.  
  47. // 贝塞尔曲线(创建一个圆)
  48. UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(, )
  49. radius:
  50. startAngle:DEGREES()
  51. endAngle:DEGREES()
  52. clockwise:YES];
  53. // 获取path
  54. _maskLayer.path = path.CGPath;
  55. _maskLayer.position = CGPointMake(_showView.bounds.size.width/.f,
  56. _showView.bounds.size.height/.f);
  57. // 设置填充颜色为透明
  58. _maskLayer.fillColor = [UIColor blackColor].CGColor;
  59. _maskLayer.position = self.view.center;
  60.  
  61. UIView *blurView = [[UIView alloc] initWithFrame:self.view.bounds];
  62. blurView.backgroundColor = [UIColor blackColor];
  63. [self.view addSubview:blurView];
  64. blurView.layer.mask = _maskLayer;
  65. blurView.layer.contents = (__bridge id)([[UIImage imageNamed:@"back"] blurImage].CGImage);
  66.  
  67. /* ====== 透明的View,用于maskView中的ShapeLayer的参考View(用于拖拽) ====== */
  68. _showView = [[UIView alloc] initWithFrame:CGRectMake(, , , )];
  69. _showView.backgroundColor = [UIColor clearColor];
  70. _showView.center = self.view.center;
  71. [self.view addSubview:_showView];
  72.  
  73. UIPanGestureRecognizer *recognizer = \
  74. [[UIPanGestureRecognizer alloc] initWithTarget:self
  75. action:@selector(handlePan:)];
  76. [_showView addGestureRecognizer:recognizer];
  77. }
  78.  
  79. @end

这个地方很关键哦,没有关闭的话会非常的卡顿的.

shapeLayer作为mask的一些技巧.

CAShapeLayer的使用[1]的更多相关文章

  1. 用CAShapeLayer实现一个简单的饼状图(PieView)

    自己写了一个简单的PieView,demo在这里:https://github.com/Phelthas/LXMPieView 效果如图: 参考了https://github.com/kevinzho ...

  2. 关于CAShapeLayer的一些实用案例和技巧【转】

    本文授权转载,作者:@景铭巴巴 一.使用CAShapeLayer实现复杂的View的遮罩效果 1.1.案例演示 最近在整理一个聊天的项目的时候,发送图片的时候,会有一个三角的指向效果,指向这张图片的发 ...

  3. 动画黄金搭档:CADisplayLink&CAShapeLayer

    我们在开发中有时会遇到一些看似非常复杂的动画,不知该如何下手,今天的这篇文章中我会讲到如何利用CADisplayLink和CAShapeLayer来构建一些复杂的动画,希望能在你下次构建动画中,给你一 ...

  4. 动画黄金搭档:CADisplayLink & CAShapeLayer

    我们在开发中有时会遇到一些看似非常复杂的动画,不知该如何下手,今天的这篇文章中我会讲到如何利用CADisplayLink和CAShapeLayer来构建一些复杂的动画,希望能在你下次构建动画中,给你一 ...

  5. iOS关于CAShapeLayer与UIBezierPath的知识内容

    使用CAShapeLayer与UIBezierPath可以实现不在view的drawRect方法中就画出一些想要的图形 . 1:UIBezierPath: UIBezierPath是在 UIKit 中 ...

  6. iOS CAShapeLayer记录

    基本知识 看看官方说明: /* The shape layer draws a cubic Bezier spline in its coordinate space. * * The spline ...

  7. CAShapeLayer(持续更新)

    CAShapeLayer 之前讲过CALayer动画相关知识,再来看看更加复杂的CAShapeLayer相关的动画知识. 普通CALayer在被初始化时是需要给一个frame值的,这个frame值一般 ...

  8. iOS 中 CAShapeLayer 的使用( 等待删除的博文)

    等待删除. 1.CAShapeLayer 简介 1.CAShapeLayer继承至CALayer,可以使用CALayer的所有属性值 2.CAShapeLayer需要与贝塞尔曲线配合使用才有意义 3. ...

  9. CAShapeLayer

    之前讲过CALayer动画相关知识,再来看看更加复杂的CAShapeLayer相关的动画知识. 普通CALayer在被初始化时是需要给一个frame值的,这个frame值一般都与给定view的boun ...

  10. CAShapeLayer 与贝塞尔曲线

    一 CAShapeLayer 简介 1,CAShapeLayer继承至CALayer,可以使用CALayer的所有属性 2,CAShapeLayer需要与贝塞尔曲线配合使用才有意义:单独使用毫无意义 ...

随机推荐

  1. Chrome DevTools的15个使用技巧(译)

    谷歌浏览器如今是Web开发者们所使用的最流行的网页浏览器.伴随每六个星期一次的发布周期和不断扩大的强大的开发功能,Chrome变成了一个必须掌握的工具.大多数前端开发者可能熟悉关于chorme的许多特 ...

  2. 030-ftputils工具栏模板

    模板一: package cn.e3mall.common.utils; import java.io.File; import java.io.FileInputStream; import jav ...

  3. JavaScript设计模式-5.接口

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. linux mint 19安装最新社区版docker

    sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-p ...

  5. Linux常用命令之sed(2)

    Sed SED的英文全称是 Stream EDitor,它是一个简单而强大的文本解析转换工具,在1973-1974年期间由贝尔实验室的Lee E. McMahon开发,今天,它已经运行在所有的主流操作 ...

  6. C#(winform)的label自动换行

    Label 是没有自动换行属性的,不像Textbox有WordWrap属性 尽管没有自动换行的属性,但也能够自动换行, 首先 AutoSize改成false; 然后调整 Label的大小,长和宽 (也 ...

  7. %notfound的理解——oracle存储过程 .

    文档中的解释:It returns TRUE if an INSERT, UPDATE, or DELETE statement affected no rows, or a SELECT INTO ...

  8. [Mysql 查询语句]——查询字段

    查询所有字段     select  *  from  表名; 可以用 * 号代表所有字段 select * from vendors; +---------+----------------+--- ...

  9. Orchard源码:热启动

    概述 IIS线程池中的线程数量是有限制的.当有多个长时间请求时,可能会耗尽IIS可用线程.出现503错误.在MVC中.当遇到非CPU操作的长时间请求时,MVC提供了异步方法来解决这个问题. 例:利用a ...

  10. Emacs快速入门

    Emacs 快速入门 Emacs 启动: 直接打emacs, 如果有X-windows就会开视窗. 如果不想用X 的版本, 就用 emacs -nw (No windows)起动. 符号说明 C-X ...