Events
iOS开发中 分别对应三种Events 1.触摸事件(例如用户点击、捏合图片等) 2.运动事件(例如用户摇晃设备) 3.远程控制事件(例如用户通过耳机控制音量)
在iOS中并不是所有的类都能处理接收并事件,只有继承自UIResponder类的对象才能处理事件(如UIView、UIViewController、UIApplication)
1.触摸事件相对应的几种方法
//一根或多根手指开始触摸屏幕时执行;
- (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;
在StoryBorad中设置支持多点触控
设置多点触控.png勾选Multiple Touch即可
2.运动事件相对应的几种方法
//运动开始时执行
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event NS_AVAILABLE_IOS(3_0);
//运动结束后执行
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event NS_AVAILABLE_IOS(3_0);
//运动被意外取消时执行
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event NS_AVAILABLE_IOS(3_0);
3.远程控制事件对应一种方法
//接收到远程控制消息时执行
-(void)remoteControlReceivedWithEvent:(UIEvent *)event NS_AVAILABLE_IOS(4_0);
2.事件分发过程
事件分发过程.png
左侧为较为简单的传递过程 一次逐级递减
右侧为常见事件传递过程 会在层级中进行判断
3.无法响应事件的原因
.userInteractionEnabled=NO
.hidden=YES
.alpha=0~0.01
//没有实现开始触摸方法(touchesBegan:withEvent:)
手势识别
手势的概念:按照一定的特殊规律出现的一系列触摸事件
1.iOS定义了六种手势操作
UITapGestureRecognizer //点按手势
UIPinchGestureRecognizer //捏合手势
UIPanGestureRecognizer //拖动手势
UISwipeGestureRecognizer //轻扫手势,支持四个方向的轻扫,但是不同的方向要分别定义轻扫手势
UIRotationGestureRecognizer //旋转手势
UILongPressGestureRecognizer //长按手势
所有的手势均为UIGestureRecognizer的子类
手势实现原理:
1.收集UITouch
2.判断是否符合规律
-若符合规律则触发手势
-若不符合规律则判断为一般触摸事件
例如:double tap
2.连续以及离散手势
iOS定义的六种手势中 五中为连续手势 只有一种(UITapGestureRecgnier)为离散手势 其特征是:一旦识别无法取消 而且只会调用一次手势操作事件 而连续手势则是可以取消手势并且会多次调用手势操作事件
3.使用手势
使用步骤:
1.创建对应的手势对象
2.设置手势识别属性【可选】
3.附加手势到指定的对象
4.编写手势操作方法
-通过代码添加手势
#pragma mark: ---add gesture---
UIRotationGestureRecognizer *rotationGesture=[[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotateImage:)];
[self.view addGestureRecognizer:rotationGesture];
}
#pragma mark: --- set gestureRecognizer---
-(void)rotateImage:(UIRotationGestureRecognizer *)gesture{
//NSLog(@"rotate:%i",gesture.state);
if (gesture.state==UIGestureRecognizerStateChanged) {
//
self.myScrollView.transform=CGAffineTransformMakeRotation(gesture.rotation);
}else if(gesture.state==UIGestureRecognizerStateEnded){
[UIView animateWithDuration:0.8 animations:^{
self.myScrollView.transform=CGAffineTransformIdentity;
}];
}
}
-通过StroyBorad添加手势
1.将需要的手势拖进对应的View中
通过StoryBorad添加手势.png
2.打开Assistant editor 在对应的.m文件中进行拖线 添加事件 即可完成
拖线.png3.检查是否支持User Interaction Enabled 若没有勾选该选项 则需要手动勾选
检查支持.png
是否支持多个手势
注:需要在.h文件中遵守UIGestureRecognizer协议
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
ScrollView
ScrollView提供了View所不具备的滑动功能 以便实现更复杂的效果
1.设置ScrollView的大小(滑动范围)
由于ScrollView常见会配合PageControl使用 因此宽度可以直接乘上pageControl的总页数
self.myScrollView.contentSize =CGSizeMake(self.view.frame.size.width * pageNum,self.view.frame.size.height);
2.ScrollView几种特殊显示效果(也可以在StoryBoard中设置)
self.myScrollView.bounces = NO; //回弹效果
self.myScrollView.showsHorizontalScrollIndicator = NO; //宽度指示条
self.myScrollView.showsVerticalScrollIndicator = NO; //高度指示条
3.ScrollView起始位置(contentOffset)
self.myScrollView.contentOffset = CGPointMake(0, 0);)
4.ScrollView协议方法
ScrollView协议.png5.ScrollView自带pinch方法
pinch.png在自己写代码的过程中会发现 pinch以后无法进行左右滑动(原因是contentSize变化了) 目前找到的方法是在原有的ScrollView上再添加一层一样的ScrollView 背景色为透明色 原有的ScrollView控制滑动 新加的ScrollView控制Pinch 或者重构zoomingInScrollView方法
网友评论