如何用UIGestureRecognizer去侦测使用者输入

在3.2以前我们要用到UITouch跟用户互动,大部分都是通过UIResponser四种methods

  1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
  2. - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event  
  3. - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event  
  4. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event  

有些人会把UITouch重新wrap丢到自己的queue里面去处理,
不然就是直接在这几个function里直接判断,其实都不会差太多,简单的说...就是麻烦 
3.2以后,透过UIGestureRecognizer及其它继承它的UIxxxGestureRecognizer,
侦测使用者输入就变的简单许多

  1. UILongPressGestureRecognizer  
  2. UIPanGestureRecognizer  
  3. UIPinchGestureRecognizer  
  4. UIRotationGestureRecognizer  
  5. UISwipeGestureRecognizer  
  6. UITapGestureRecognizer  

照名字看大概就知道这是做什么用的,所以我就不解释啦,直接看用法.....
以UIPanGestureRecognizer为例,这是处理使用者用一只手指(或多只)在屏幕上滑来滑去的动作,
要侦测这个动作,只要加下面这段code进viewDidLoad或任何你需要的地方...

  1. UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];  
  2. [self.view addGestureRecognizer:panRecognizer];  
  3. panRecognizer.maximumNumberOfTouches = 1;  
  4. panRecognizer.delegate = self;  
  5. [panRecognizer release];  

第一个很简单,就是确定要给这个recognizer handle的event,就会去call这个class底下的handlePanFrom:
然后把recognizer加进UIView里(addGestureRecognizer),
因为同时间我只想知道一只手指的动作,所以我用maximumNumberOfTouches=1来限制,
当然,你可以改变maximumNumberOfTouches跟minimumNumberOfTouches的值来当成filter,接着把delegate设定成自己(记得header要加上UIGestureRecognizerDelegate),不过这样还没有结束...
我们要补上这个delegate method

  1. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {  
  2. }  
里面可以先filter event,决定要不要丢给一开始assign给panRecognizer的selector function
譬如我只想要看某个subview的事件

  1. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{  
  2.    UIView *aview = [self.view viewWithTag:1000];  
  3.    if (touch.view != aview) {  
  4.      return NO; // 不理這個event  
  5.    }  
  6.    return YES;  
  7. }  

接下来就是

  1. - (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer {          
  2.         //拿到手指目前的位置  
  3.         CGPoint location = [recognizer locationInView:self.view];  
  4.         UIView *aview = [self.view viewWithTag:1000];  
  5.   
  6.         // 如果UIGestureRecognizerStateEnded的話...你是拿不到location的  
  7.         // 不判斷的話,底下改frame會讓這個subview消失,因為origin的x和y就不見了!!!  
  8.         if(recognizer.state != UIGestureRecognizerStateEnded)  
  9.         {  
  10.                 aview.frame = CGRectMake(location.x, location.y, aview.frame.size.width, aview.frame.size.height);  
  11.         }  
  12. }  

不同的UIGestureRecognizer subclass都会有不同特点,譬如说Pinch的scale,velocity和Swipe的direction,
直接简化了处理UITouch的步骤,大家只要知道这些特点,处理使用者输入就会得心应手啦~
遇到灵异事件...记得先看看有没有判断UIGestureRecognizer的state

先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值