触摸事件与手势识别是ios中比较核心的功能,因为ios设备通常就只有5个实体按钮:音量大小,静音,开关与home键。因此了解、使用触摸事件与手势识别是学习ios的重点内容。
一、触摸事件
触摸事件主要有以下几个方法:
-(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;
从方法名称就能知道每个方法分别在什么时候执行。
需要注意的是触摸事件在ios中的事件传输机制。当发生触摸事件时,系统会判断触摸事件发生在哪一个view中,然后判断当前view是否实现了触摸事件的方法,如果没有,那么该事件就会传递到当前view的superview中,如果仍未实现,则继续向上传递,一直传递到application,最后还是没有实现,则丢弃该事件。
比如想实现一个跟随移动的小球,只需在小球的view里面添加如下代码即可:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint current = [touch locationInView:self.superview];
self.center = current;
}
很简单的三行代码就实现来一个随手指移动的ui控件,是不是很神奇!
从上面可以看到方法传进了一个touches参数,这个参数包含了UITouch类,而UITouch类包含了如下信息:
1.window 触摸时所在的窗口
2.view 触摸时所在的view
3.tapcount 短时间内点击的次数
4.timestamp 触摸产生或变化的时间戳
5.phase 触摸周期内的各个状态
6.locationinview 取得在制定视图的位置
6.previouslocationinview 前一个位置
二、手势识别
在ios3.2过后苹果为我们封装了一些常用手势,这样就不需要我们自己写算法来判断用户手势了。在ios中有六种手势供我们使用:
UITapGestureRecognizer 点按手势
UIPinchGestureRecognizer 捏合手势
UIPanGestureRecognizer 拖动手势
UISwipeGestureRecognizer 轻扫手势(注意轻扫有四个方向,上下左右,需要分别设置)
UITRotationGestureRecognizer 旋转手势
UILongPressGestureRecognizer 长按手势
他们都是继承自UIGestureRecognizer,但是这个类本身是不能直接使用的。
属性:
@property(nonatomic,readonly)UIGestureRecognizerState state; 手势状态
@property(nonatomic,getter=isEnabled)BOOL enabled; 手势是否可用
@property(nonatomic,readonly)UIView *view; 触发手势的视图
@property(nonatomic)delaysTouchesBegan; 手势识别失败前是否执行触摸开始事件
常用方法:
-(void)addTarget:(id)target action:(SEL)action; 添加触摸执行事件
-(void)removeTarget:(id)target action:(SEL)action; 移除触摸执行事件
-(NSInteger)numberOfTouches; 触摸点的个数
-(CGPoint)locationInView:(UIView *)view; 触摸点在指定视图中的位置
-(CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(UIView *)view; 触摸点相对于指定视图的位置
下面是一个向左轻扫的代码片段,展示了如何使用手势识别:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeLeft];
}
-(void)swipe
{
NSLog(@"YC");
}
触摸事件与手势识别还有很多地方值得研究,这篇文章就写到这里,以后等需要再继续研究。