前面我们主要介绍了触摸事件以及由触摸事件引出的手势识别,下面我们简单介绍一下运动事件。在iOS中和运动相关的有三个事件:开始运动、结束运动、取消运动。
监听运动事件对于UI控件有个前提就是监听对象必须是第一响应者(对于UIViewController视图控制器和UIAPPlication没有此要求)。这也就意味着如果监听的是一个UI控件那么-(BOOL)canBecomeFirstResponder;方法必须返回YES。同时控件显示时(在-(void)viewWillAppear:(BOOL)animated;事件中)调用视图控制器的becomeFirstResponder方法。当视图不再显示时(在-(void)viewDidDisappear:(BOOL)animated;事件中)注销第一响应者身份。
由于视图控制器默认就可以调用运动开始、运动结束事件在此不再举例。现在不妨假设我们现在在开发一个摇一摇找人的功能,这里我们就自定义一个图片展示控件,在这个图片控件中我们可以通过摇晃随机切换界面图片。代码比较简单:
KCImageView.m
//// KCImageView.m// TouchEventAndGesture//// Created by Kenshin Cui on 14-3-16.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#import "KCImageView.h"#define kImageCount 3@implementation KCImageView- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.image=[self getImage]; } return self;}#pragma mark 设置控件可以成为第一响应者-(BOOL)canBecomeFirstResponder{ return YES;}#pragma mark 运动开始-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{ //这里只处理摇晃事件 if (motion==UIEventSubtypeMotionShake) { self.image=[self getImage]; }}#pragma mark 运动结束-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{}#pragma mark 随机取得图片-(UIImage *)getImage{ int index= arc4random()%kImageCount; NSString *imageName=[NSString stringWithFormat:@"avatar%i.png",index]; UIImage *image=[UIImage imageNamed:imageName]; return image;}@end
KCShakeViewController.m
//// KCShakeViewController.m// TouchEventAndGesture//// Created by Kenshin Cui on 14-3-16.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#import "KCShakeViewController.h"#import "KCImageView.h"@interface KCShakeViewController (){ KCImageView *_imageView;}@end@implementation KCShakeViewController- (void)viewDidLoad { [super viewDidLoad];}#pragma mark 视图显示时让控件变成第一响应者-(void)viewDidAppear:(BOOL)animated{ _imageView=[[KCImageView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame]; _imageView.userInteractionEnabled=true; [self.view addSubview:_imageView]; [_imageView becomeFirstResponder];}#pragma mark 视图不显示时注销控件第一响应者的身份-(void)viewDidDisappear:(BOOL)animated{ [_imageView resignFirstResponder];}/*视图控制器的运动事件*///-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{// NSLog(@"motion begin...");//}////-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{// NSLog(@"motion end.");//}@end
运行效果(下图演示时使用了模拟器摇晃操作的快捷键,没有使用鼠标操作):