監(jiān)聽(tīng)觸摸事件的做法
- 如果想監(jiān)聽(tīng)一個(gè)view上面的觸摸事件,之前的做法是
1.自定義一個(gè)view
2.實(shí)現(xiàn)view的touches方法,在方法內(nèi)部實(shí)現(xiàn)具體處理代碼 -
注意:通過(guò)touches方法監(jiān)聽(tīng)view觸摸事件,有很明顯的幾個(gè)缺點(diǎn)
1.必須得自定義view
2.由于是在view內(nèi)部的touches方法中監(jiān)聽(tīng)觸摸事件,因此默認(rèn)情況下,無(wú)法讓其他外界對(duì)象監(jiān)聽(tīng)view的觸摸事件
3.不容易區(qū)分用戶的具體手勢(shì)行為 - iOS 3.2之后,蘋(píng)果推出了手勢(shì)識(shí)別功能(Gesture Recognizer),在觸摸事件處理方面,大大簡(jiǎn)化了開(kāi)發(fā)者的開(kāi)發(fā)難度
UIGestureRecognizer的使用
1.什么是UIGestureRecognizer:
UIGestureRecognizer手勢(shì)識(shí)別器
2.優(yōu)點(diǎn) :
利用UIGestureRecognizer,能輕松識(shí)別用戶在某個(gè)view上面做的一些常見(jiàn)手勢(shì)
3.注意點(diǎn):
UIGestureRecognizer是一個(gè)抽象類(lèi),定義了所有手勢(shì)的基本行為,使用它的子類(lèi)才能處理具體的手勢(shì)
4.UIGestureRecognizer的子類(lèi)
UITapGestureRecognizer(敲擊)
UIPinchGestureRecognizer(捏合,用于縮放)
UIPanGestureRecognizer(拖拽)
UISwipeGestureRecognizer(輕掃)
UIRotationGestureRecognizer(旋轉(zhuǎn))
UILongPressGestureRecognizer(長(zhǎng)按)
手勢(shì)的使用
注意:在使用手勢(shì)時(shí),涉及到形變的手勢(shì),不能使用make的transform方法
//self.imageV.transform = CGAffineTransformMakeTranslation(point.x, point.y);
因?yàn)楫?dāng)移動(dòng)完畢后,在次點(diǎn)擊拖動(dòng)時(shí),圖片會(huì)回到最開(kāi)始的位置,make的transform方法是相對(duì)于最原始的位置進(jìn)行形變的而且只會(huì)執(zhí)行一次,所以在拖動(dòng)的時(shí)候,總是會(huì)回到起始點(diǎn)后,所以在拖動(dòng)過(guò)程中,就會(huì)出現(xiàn)震顫的效果;
可以使用沒(méi)有make的transform方法
self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, point.x, point.y);
因?yàn)檫@個(gè)方法的形變值,是相對(duì)上一次而非最初的狀態(tài)的形變值,因此獲取相對(duì)最初位置的偏移量是累加了之前的偏移量的值,獲取到的偏移值會(huì)比實(shí)際的偏移值大很多,但是需要的偏移量是要相對(duì)圖片最初位置的偏移量,所以,在這里需要調(diào)用setTranslation: inView:方法,在拖動(dòng)時(shí),將上一次的偏移值清空,以獲取拖動(dòng)時(shí)相對(duì)初始位置的偏移值.
- 1.UITapGestureRecognizer(敲擊)
/*************手勢(shì)點(diǎn)按*************/
-(void)tapTestGes{
//創(chuàng)建手勢(shì)
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGes)];//當(dāng)圖片沒(méi)有接受到手勢(shì)的觸摸事件后,不會(huì)調(diào)用tap方法
//給圖片添加手勢(shì)
[self.imageV addGestureRecognizer:tap];
}
//手勢(shì)的方法
-(void)tapGes{
NSLog(@"%s",__func__);
}
- 2.UIPinchGestureRecognizer(捏合,用于縮放)
/*************捏合手勢(shì)*************/
-(void)pinchGes{
UIPinchGestureRecognizer * pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGes:)];
pinch.delegate = self;
[self.imageV addGestureRecognizer:pinch];
}
//捏合手勢(shì)的方法
-(void)pinchGes:(UIPinchGestureRecognizer *)pinch
{
self.imageV.transform = CGAffineTransformScale(self.imageV.transform, pinch.scale, pinch.scale);//如果縮放倍數(shù)寫(xiě)成常數(shù),那么久只能放大或縮小
[pinch setScale:1];
}
- 3.UIPanGestureRecognizer(拖拽)
/*************拖動(dòng)手勢(shì)*************/
-(void)panGes{
UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGes:)];
[self.imageV addGestureRecognizer:pan];
}
//平移圖片
-(void)panGes:(UIPanGestureRecognizer *)pan
{
//獲取圖片相對(duì)最開(kāi)始時(shí)的自己的位置
CGPoint point = [pan translationInView:self.imageV];
self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, point.x, point.y);
//重置圖片的移動(dòng)距離(相對(duì)于上一次)
NSLog(@"%@",NSStringFromCGPoint(point));
[pan setTranslation:CGPointZero inView:self.imageV];
}
- 4.UISwipeGestureRecognizer(輕掃)
//設(shè)置輕掃方向
1.只有在同一水平方向上的手勢(shì)可以拼接,不在同一水平方向上的手勢(shì)不可以拼接
2.拼接以后只能識(shí)別圖片被輕掃了,但不能識(shí)別往哪個(gè)方向輕掃
3.要想識(shí)別圖片是往哪個(gè)方向輕掃了,需要添加兩個(gè)輕掃手勢(shì)對(duì)象,其中一個(gè)手勢(shì)對(duì)象必須指明要滑動(dòng)的方向
/*************輕掃手勢(shì)*************/
-(void)swipeGes{
//創(chuàng)建輕掃手勢(shì)
UISwipeGestureRecognizer * swipe1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGes:)];
//設(shè)置輕掃方向
swipe1.direction = UISwipeGestureRecognizerDirectionLeft;
//給圖片添加輕掃手勢(shì)
[self.imageV addGestureRecognizer:swipe1];
//創(chuàng)建第二個(gè)輕掃手勢(shì)
UISwipeGestureRecognizer * swipe2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGes:)];
//給圖片添加第二個(gè)輕掃手勢(shì)
[self.imageV addGestureRecognizer:swipe2];
}
//輕掃手勢(shì)方法的實(shí)現(xiàn)
-(void)swipeGes:(UISwipeGestureRecognizer *)swipe
{
if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {
NSLog(@"向左輕掃圖片");
}else if (swipe.direction == UISwipeGestureRecognizerDirectionRight){
NSLog(@"向右輕掃圖片");
}else{
NSLog(@"無(wú)法識(shí)別輕掃圖片的方向");
}
}
- 5.UIRotationGestureRecognizer(旋轉(zhuǎn))
/*************旋轉(zhuǎn)手勢(shì)*************/
-(void)rotationGes{
UIRotationGestureRecognizer * rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGes:)];
rotation.delegate = self;
[self.imageV addGestureRecognizer:rotation];
}
//旋轉(zhuǎn)手勢(shì)的方法
-(void)rotationGes:(UIRotationGestureRecognizer *)rotation
{
self.imageV.transform = CGAffineTransformRotate(self.imageV.transform, rotation.rotation);
[rotation setRotation:0];
}
- 6.UILongPressGestureRecognizer(長(zhǎng)按)
/*************手勢(shì)長(zhǎng)按*************/
-(void)longPressGes
{
//創(chuàng)建長(zhǎng)按手勢(shì)
UILongPressGestureRecognizer * longP = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPGes:)];
//給圖片添加長(zhǎng)按手勢(shì)
[self.imageV addGestureRecognizer:longP];
}
//當(dāng)長(zhǎng)按的時(shí)候會(huì)調(diào)用此方法
-(void)longPGes:(UILongPressGestureRecognizer *)longP
{
//判斷長(zhǎng)按手勢(shì)的狀態(tài).因此,方法應(yīng)該傳入長(zhǎng)按手勢(shì)對(duì)象
if (longP.state == UIGestureRecognizerStateBegan) {
NSLog(@"開(kāi)始長(zhǎng)按");
}else if (longP.state == UIGestureRecognizerStateChanged){
NSLog(@"開(kāi)始滑動(dòng)");
}else if (longP.state == UIGestureRecognizerStateEnded){
NSLog(@"結(jié)束長(zhǎng)按");
}
}
- 設(shè)置是否允許手指觸摸,需要設(shè)置代理,并實(shí)現(xiàn)下面的代理方法
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
//獲取當(dāng)前觸摸點(diǎn)的位置
CGPoint curP = [touch locationInView:self.imageV];
//設(shè)置可觸摸的范圍(左側(cè)不可觸摸,右側(cè)可以觸摸)
if (curP.x <= self.imageV.frame.size.width * 0.5) {
NSLog(@"%@",NSStringFromCGPoint(curP));
NSLog(@"不可以觸摸");
return NO;
}else{
NSLog(@"%@",NSStringFromCGPoint(curP));
NSLog(@"可以觸摸");
return YES;
}
- 設(shè)置是否允許接受多個(gè)手勢(shì),設(shè)置對(duì)應(yīng)手勢(shì)的代理,并實(shí)現(xiàn)下面的dialing方法
//實(shí)現(xiàn)代理方法
//同時(shí)執(zhí)行多個(gè)手勢(shì)操作
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}