初级_触摸事件
iOS事件###
1.触摸事件:通过手势触发
2.运动事件:通过手机摇晃,加速器进行触发
3.远程控制事件:通过其他远程设备触发
处理触发事件需要继承UIResponder类的对象才能使用,UIResponder类定义了三类事件相关的处理方法:
触发事件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
...
运动事件
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
...
远程处理事件
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;
...
手势使用方法###
创建手势对象
UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];
设置手势属性
tapGesture.numberOfTapsRequired=1;
添加手势所在的对象
[self.view addGestureRecognizer:tapGesture];
编写手势触发方法
-(void) tapGesture:(UITapGestureRecognizer *)gesture{}
默认是不支持交互的,也就是userInteractionEnabled=NO,因此要接受手势必须设置userInteractionEnabled=YES(在iOS中UILabel、UIImageView的userInteractionEnabled默认都是NO,UIButton、UITextField、UIScrollView、UITableView等默认都是YES)。
轻扫手势虽然是连续手势但是它的操作事件只会在识别结束时调用一次,其他连续手势都会调用多次,一般需要进行状态判断;此外轻扫手势支持四个方向,但是如果要支持多个方向需要添加多个轻扫手势。
手势冲突###
手势和手势触发区域有交集时,会导致其中一个手势执行失败。
解决冲突方法
- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;
一个手势完成的前提,为另外一种手势执行失败。
– (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isKindOfClass:[UIButton class]]){
return NO;
}
return YES;
}
设置手势在固定控件或区域不响应
iOS的触摸事件中,事件触发是根据响应者链进行的,上层触摸事件执行后就不再向下传播。默认情况下手势也是类似的,先识别的手势会阻断手势识别操作继续传播。如果想让两层控件都添加了手势的控件都能正确识别手势,可以用代理传递下去。
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
默认返回NO,如果返回YES则手势向下传递。
运动事件###
和运动相关包括三个事件:运动开始、运动结束、取消运动
监听运动事件对UI控件有个前提,必须让监听的控件成为第一响应者(对于UIViewController视图控制器和UIAPPlication没有此要求)。也就是说(BOOL)canBecomeFirstResponder;方法必须返回YES。同时控件显示时(在-(void)viewWillAppear:(BOOL)animated;事件中)调用视图控制器的becomeFirstResponder方法。当视图不再显示时(在-(void)viewDidDisappear:(BOOL)animated;事件中)注销第一响应者身份。
pragma mark 设置控件可以成为第一响应者
-(BOOL)canBecomeFirstResponder{
return YES;
}
#pragma mark 运动开始
-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{
//这里只处理摇晃事件
if (motion==UIEventSubtypeMotionShake) {
}
}
#pragma mark 运动结束
-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
}
远程控制事件###
有一个和远程控制相关的方法:
-(void)remoteControlReceivedWithEvent:(UIEvent *)event;
要监听到这个事件有三个前提(视图控制器UIViewController或应用程序UIApplication只有两个)
1.启用远程事件接收使用[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];方法。
2.对于UI控件同样要求必须是第一响应者(对于视图控制器UIViewController或者应用程序UIApplication对象监听无此要求)。
3.应用程序必须是当前音频的控制者,也就是在iOS 7中通知栏中当前音频播放程序必须是我们自己开发程序。
感谢笔记出处http://www.cnblogs.com/kenshincui/p/3950646.html#autoid-4-0-0