用法:采用的是关键帧实现的。

实验目的:让上层的layer子层能够跟着在另一个子层上花的线进行移动 。即当线画完之后,图形开始移动,并且能够停在最后的那个位置

效果图:

采用是直接在layer图层上进行画的,

下边是代码的具体实现

viewController.m

属性:

@interface ViewController ()
@property(nonatomic,assign)CGMutablePathRef path;//添加一个可变路径
@property(nonatomic,strong)CALayer *rectLayer;//添加画图子层
@property(nonatomic,strong)CALayer *drawLayer;//添加画线子层
@end

/*步骤:

1创建一个子层  在子层上上有一个图形

2创建一个子层 用来画线 并且记录在移动的过程中的路径

3给有图形的子层设置动画 跟线的路径是一样一样的

*/

- (void)viewDidLoad {
[super viewDidLoad]; //对划线的自曾进行相应的设计
_drawLayer = [[CALayer alloc]init];
_drawLayer.bounds = self.view.bounds;
_drawLayer.position = self.view.layer.position;
_drawLayer.anchorPoint = self.view.layer.anchorPoint; //设置drawLayer的代理为自己 让代理进行画图设置及画图的工作
self.drawLayer.delegate = self;
[self.view.layer addSublayer:_drawLayer]; //对子层进行初始化
_rectLayer = [[CALayer alloc]init];
_rectLayer.backgroundColor = [[UIColor yellowColor]CGColor];
//大小
_rectLayer.bounds = CGRectMake(0, 0, 30, 30);
//墙上的位置
_rectLayer.position = CGPointMake(100, 100); [self.view.layer addSublayer:_rectLayer]; }

/*

开始画线 画线需要路径

在触摸开始的时候创建路径 并设置开始点为触摸点

在触摸移动的时候添加线进去并刷新

在触摸结束的时候释放路径(因为path的创建是creat 需要手动释放)

*/

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//创建一个可变的path
_path = CGPathCreateMutable(); //获得当前点 并将当前点设置为path的开始点
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self.view];
CGPathMoveToPoint(_path, nil, location.x, location.y); }
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if(_path)
{
//获得当前点 并将点添加到path中
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self.view];
CGPathAddLineToPoint(_path, nil, location.x, location.y); [self.drawLayer setNeedsDisplay];
}
}

/*

在触摸结束的时候开始一个动画  当然了这个动画效果就是图片层的移动

首先应该创建一个动画帧 动画

然后设置相应的参数

最后给要设置的涂层加上动画

*/

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{ /*
在触摸结束的时候开始一个动画 当然了这个动画效果就是图片层的移动
首先应该创建一个动画帧 动画
然后设置相应的参数
最后给要设置的涂层加上动画
*/
CAKeyframeAnimation *keyFrameA = [[CAKeyframeAnimation alloc]init];
//持续时间是3秒
keyFrameA.duration = 6.0f;
//设置 keyPath(指定的接受动画的关键路径 也就是点)
keyFrameA.keyPath = @"position";
//设置 path (基于点的属性的路径)
keyFrameA.path = self.path; //设置图能够留在最后的位置
keyFrameA.removedOnCompletion = NO;
keyFrameA.fillMode = kCAFillModeForwards; //相应的添加动画
[self.rectLayer addAnimation:keyFrameA forKey:@"keyFrame"];
if(_path)
{
//释放path
CGPathRelease(_path);
}
}
#pragma mark-实现caLayer的代理方法
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
CGContextAddPath(ctx, _path);//将path加入到ctx中 //设置花臂的颜色
CGContextSetStrokeColorWithColor(ctx, [[UIColor redColor]CGColor]); CGContextDrawPath(ctx, kCGPathStroke);//设置值描边不填充
}

一个layer可以跟着画完的线移动ios程序 好玩啊。的更多相关文章

  1. caffe实现focal loss层的一些理解和对实现一个layer层易犯错的地方的总结

    首先要在caffe.proto中的LayerParameter中增加一行optional FocalLossParameter focal_loss_param = 205;,然后再单独在caffe. ...

  2. 从安装Mac OS X虚拟机到第一个IOS程序

    对于纯粹地抄这种行为是比较抵触的,别人已经写得挺好的东西没必要又去写一遍,但如果不写经验来看下次再做时自己又要重复百度筛选一遍,所以还是要记一记. 之前要获取IOS静态库的版本,但一直以来没有Mac没 ...

  3. [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld

    首先这篇文章比较长,若想了解Xcode7的免开发者帐号真机调试运行IOS程序的话,直接转到第五部分. 转载请注明原文地址:http://www.cnblogs.com/litou/p/4843772. ...

  4. C#实现如何判断一个数组中是否有重复的元素 返回一个数组升序排列后的位置信息--C#程序举例 求生欲很强的数据库 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework

    C#实现如何判断一个数组中是否有重复的元素   如何判断一个数组中是否有重复的元素 实现判断数组中是否包含有重复的元素方法 这里用C#代码给出实例 方法一:可以新建一个hashtable利用hasht ...

  5. 使用OLAMISDK实现一个语音输入数字进行24点计算的iOS程序

    前言 在目前的软件应用中,输入方式还是以文字输入方式为主,但是语音输入的方式目前应用的越来越广泛.这是一个利用 Olami SDK 编写的一个24点iOS程序,是通过语音进行输入. Olami SDK ...

  6. 返回一个数组升序排列后的位置信息--C#程序举例

    返回一个数组升序排列后的位置信息--C#程序举例 返回某一个数组升序排序后的位置  比如:{8,10,9,11}排序后应该是{8,9,10,11},但是需要返回{1,3,2,4}   大概记忆里是这么 ...

  7. 第一个iOS程序:Hello iOS

    今天我们来创建第一个iOS程序:Hello iOS!不需要写任何代码就能实现:

  8. 02-第一个iOS程序-开发步骤

    打开Xcode 选择项目模板 Single View Application是最适合初学者的模板 设置项目属性 运行程序 不管怎样,先运行第一个iOS程序看看效果先(用快捷键Command + R 也 ...

  9. 02-第一个iOS程序

    第一个iOS程序 第一个iOS程序简介 初学iOS开发,研究的程序不要过于复杂,应该从最基本的开始 大房子都是由小砖一块一块堆成的,而大型app是由无数个小程序段组成的 接下来实现一个简单的“加法计算 ...

随机推荐

  1. 射频识别技术漫谈(6)——通讯协议概述【worldsing笔记】

    通讯协议是通讯的双方或多方在交流时遵守的规矩,包括谁先发起通讯,先交流什么,后交流什么,一方如何问,另一方如何答等.在这里通迅的双方指的是读写器和卡片. 首先是谁先发起通讯,很显然有两种,读写器先发言 ...

  2. android视频播放心得体会

    android视频播放主要是两种方式1.系统封装好的videoplayer,有前进.后退.暂停/播放.拉动最基本的功能,够一般使用,操作办法也很简单,如果需要自定义程度高就需要用到第二种方法:Surf ...

  3. 测试JS基本类型以及对象的引用

    自己敲的. 1 <script src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.1.0/prototype.js&qu ...

  4. wavecom短信猫常用AT命令

    wavecom短信猫常用AT命令 一.一般命令 1. AT+CGMI 给出模块厂商的标识. 2. AT+CGMM 获得模块标识.这个命令用来得到支持的频带 (GSM 900,DCS 1800 或PCS ...

  5. mac磁盘满解决方案

    背景 : 用mac电脑的人,估计都不习惯去关机吧.mac虽然可以不需要关闭电脑,但是久而久之由于应用软件占用产生缓存文件 or 产生虚拟内容交换文件 or 睡眠镜像文件 and so on. 会占用大 ...

  6. PHP中各种Hash算法性能比较

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  7. 使用Knoctout.分页

    要点:点击标签翻页部分时,pageValue自动加1. 1.api中的方法 public ArticleListModel Get(int page,string _class) { var list ...

  8. Scribefire发CSDN博客

    历史 在非常久非常久曾经,CSDN是支持外部工具来写文章的,但是在还有一个非常久非常久曾经就不行了. 突然看到CSDN有能够用外部工具来写博客了(CSDN的公告),一直以来都纠结这个问题,CSDN的编 ...

  9. LINUX系统备份

    LINUX系统备份 =========================================================== 作者: gswwgph(http://gswwgph.itp ...

  10. C#_dropdownlist_3

    DropDownList则与TextBox等控件不同,它使用的是select标记.它需要两个值:在下拉框中显示的列表,和默认选项.而自动绑定一次只能绑定一个属性,因此你需要根据需要选择是绑定列表,还是 ...