微信推出了语音聊天之后很快推广开了,出了摇一摇功能之后,又火了一把。我们有个不着调的老师有一次就在上课不停地问同学们这个摇一摇功能的问题,大家都“含蓄”地乐个不停。
这个功能主要依托于UIResponder中的运动事件,作为UIView的父类,NSObject的子类,UIResponder主要包含了一些关于响应和运动事件的方法:
触摸事件:
1.告诉接收者(Responder)当前有一个或多个手指开始触摸屏幕时调用该方法
- (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
运动事件(以摇动为例):
1.摇动设备时发送给第一响应对象
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
2.摇动事件被打断(例如接到电话或短信等)时发送给第一响应对象
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
3.摇动事件结束时发送给第一响应对象
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
另外还有一个远程控制事件:
- (void)remoteControlReceivedWithEvent:(UIEvent *)event
在使用摇一摇之类的功能时还有一点要注意就是要设置第一响应对象
BOOL flag = [currentView becomeFirstResponder]; if (flag) { NSLog(@"当前视图是第一响应对象"); } else { NSLog(@"不是第一响应对象"); }运行后会发现控制台输出“不是第一响应对象”,大多数UIResponder对象在收到becomeFirstResponder消息后都会返回NO,这是因为大多数视图默认只关注和自身有关联的事件,比如UIButton,UITextField等等。因此只有该视图对象明确表示能够成为第一响应对象后才能通过发送becomeFirstResponder消息将其设置为第一响应对象。所以要加入下面方法
- (BOOL)canBecomeFirstResponder { return YES; }
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (motion == UIEventSubtypeMotionShake) { [currentView setBackgroundColor:[UIColor redColor]]; } }