最近开始学习IOS的开发,师兄给我提出一个需求:实现一个可拖动的转盘。师兄提示我说利用touch event和UIView animation。经过一两天的折腾边学边做,算是实现了基本功能。这里写写加深自己的印象。

  要求是这样的:在屏幕上显示一个圆盘,如果没有干扰的时候匀速转动,当手指触碰屏幕的时候转盘要跟随手指的运动而转动。我的思路是这样的:用一个NSTimer来控制转盘(UIImageView),每隔一段时间调用一个转动的动画(每次转动一个小角度),这样就可以达到匀速转动的效果。动画用UIView animation 来实现,在animation里面通过设置Trasform属性来转动。

  匀速转动的问题解决了,接下来就要解决响应手势的问题。google了一下发现了GestureRecognizer类,于是开始采用TapGestureRecognizer,SwipeGestureRecognizer,和PanGestureRecognizer来响应手指的运动。Tap对应点击,Swipe对应在屏幕上的滑动,pan则对应拖动的动作。我在imageView上面添加了这几个GestureRecognizer,然后为每一个Recognizer编写对应的处理事件。然后我遇到了几个问题,一个是事件无法按照我的预期去响应,尤其是拖动,根本一塌糊涂。还有一个就是,我对于如何使用PanGestureRecognizer没有思路。后来问问师兄,师兄提醒说试试UIView 的touch event,所以我就开始了新的摸索。

  看了一下资料以后发现其实用touch event处理更简洁,使用touch event要覆盖UIView的四个方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

手指刚刚触摸屏幕的时候触发的事件

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

手指在屏幕上移动是会不断触发这个事件

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

手指离开后触发的事件

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

触摸正常结束前,某个系统事件(例如有电话打进来)打断了触摸过程

  在这是时间里面都有一个对象NSSet,这个set里面包含了一组UITouch对象至少一个,而每一个就对应这个一个手指的状态,也就是说touch event是可以同时记录多个手指触摸的状态的。UITouch 里面记录了当前屏幕被触摸的位置,有了这个就可以实现之前说到的拖动功能了。

  大体思路是这样的,当touch开始时会触发touchesBegan事件,在这里面我记录下开始的位置startPoint,然后手指移动以后会触发touchesMoved事件,在这个事件里面得到当前位置endPoint,这样的话就得到了两个点再加上view的中心center就有了三个点,三个点构成的两条直线line1(startPoint,center) line2(endPoint,center),求出两条直线的夹角就可以知道需要转动的角度了。得出角度以后再用两条直线的到角确定转到的方向(顺时针,逆时针)。每一次转动后startPoint=endPoint继续move,直到touchesEnded就是最后的位置了。难点主要是数值计算,比较麻烦,要注意斜率不存在的情况。还有一个要注意的就是精度问题,当startPoint和endPoint相差很小的时候我是不处理的,设定一个伐值,当两点之间的距离大于一定值时才进行转动。避免了float由于数值太小导致的精度丢失,以及不必要的微小运动。

  IOS学习笔记,欢迎指正错误。XCode项目代码:http://pan.baidu.com/share/link?shareid=2625688121&uk=4245725234

IOS touch event animation 转动的风车的更多相关文章

  1. Html5 touch event

    HTML5 for the Mobile Web: Touch Events POSTED BY RUADHAN - 15 AUG 2013 See also... Touch-friendly Dr ...

  2. Touch Event

    转自:      http://hi.baidu.com/masaiui/item/971775e8b316238bc10d754b 参考: http://hedgehogking.com/?p=55 ...

  3. MonkeyRunner 连续两次点击报“Error sending touch event”

    最近用monkeyrunner做自动化测试,遇到连续两次点击,第二次点击就会报错“Error sending touch event”. 具体做法如下: device.touch(234,112, ' ...

  4. iOS Touch ID 身份认证

    iOS Touch ID 身份认证 iOS 8 及以后录了指纹的设备可以使用 touch ID 进行身份认证,指纹符合录入的指纹才能认证成功. 步骤 导入 LocalAuthentication 框架 ...

  5. taro 小程序 & touch event 转换 bug

    taro 小程序 & touch event 转换 bug before after 事件处理 https://nervjs.github.io/taro/docs/event.html#do ...

  6. iOS touch事件单击双击区分响应

    如果您的 iPhone 应用里有个 view,既有单击操作又有双击操作.用户双击 view 时,总是先执行一遍单击的操作再执行双击的操作.所以直接判断时就会发现不能直接进入双击操作.下面是区分 tou ...

  7. (转)iOS动画Core Animation

    文章转载:http://blog.sina.com.cn/s/blog_7b9d64af0101b8nh.html 在iOS中动画实现技术主要是:Core Animation. Core Animat ...

  8. iOS UIKit:animation

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  9. iOS --- Touch ID指纹解锁

    https://www.cnblogs.com/ljmaque/p/TouchID.html 最近在项目中刚好用到了TouchId指纹解锁功能,之前也没有接触过,立马百度看看究竟是要如何使用,发现其实 ...

随机推荐

  1. 又一次拾起C语言的威严

    自从用了C++,他的方便快捷一直用着屡试不爽,可是越用越认为程序不够清晰, 项目使用DSP,不得不把C++重写成C 速度没得说,很快 记录下看到的文章 少走弯路,学好C语言的推荐途径

  2. Java初认识--Java语言的书写规范及基本的运算符

    一.Java中名称的规范和书写程序的规范. 1.Java中的名称规范: (1)包名全是小写:xxyyzz: (2)类名接口名:首字母大写:XxxYyy: (3)变量名和函数名:变量名不能是关键字:多单 ...

  3. 深入struts2(三)---工作机制和运行流程图

    1     工作原理 1.1     体系架构 图2.1 struts2.0体系架构图 1.2     工作机制 针对上节体系架构图,以下分步说明运行流程 Ø  client初始化一个指向Servle ...

  4. Mvc 6 中创建 Web Api

    如何在Mvc 6 中创建 Web Api以及如何脱离IIS实现自我托管 微软推出的Asp.net vNext(asp.net 5.0)的其中的一个目标就是统一mvc 和web api 的框架.接下来我 ...

  5. HDOJ 4416 Good Article Good sentence

    题解转自:http://blog.csdn.net/dyx404514/article/details/8807440 2012杭州网络赛的一道题,后缀数组后缀自己主动机都行吧. 题目大意:给一个字符 ...

  6. windows下oracle数据库定时备份与压缩批处理脚本(win7/win2008亲测通过)

    第一种方式:全备份,并直接覆盖原来的备份文件,固定命名. 脚本: @echo off exp system/a123@HZPG file=e:\db_backup\oradata.dmp log=e: ...

  7. 解决wps for linux 中文输入法光标不跟随的问题

    需要安装qt4-qtconfig和ibus-qt4,安装ibus-qt4之后才能在qt4-qtconfig“界面”选项卡默认输入法选项中看到ibus,选定它,然后设置XIM输入风格为光标跟随风格,保存 ...

  8. 使用Flexible实现手淘H5页面的终端适配(转)

    曾几何时为了兼容IE低版本浏览器而头痛,以为到Mobile时代可以跟这些麻烦说拜拜.可没想到到了移动时代,为了处理各终端的适配而乱了手脚.对于混迹各社区的偶,时常发现大家拿手机淘宝的H5页面做讨论—— ...

  9. bat批量目光声明

    写bat同一批次,盯着函数应使用.这个程序对可读性 在批处理,凝视节还有一种更常用的方法: goto start      = 能够是多行文本,能够是命令      = 能够包括重定向符号和其它特殊字 ...

  10. 【转】【Android UI设计与开发】第07期:底部菜单栏(二)Fragment的详细介绍和使用方法

    原始地址:http://blog.csdn.net/yangyu20121224/article/category/1431917/1 由于TabActivity在Android4.0以后已经被完全弃 ...