點擊手勢UITapGestureRecognizer
創(chuàng)建手勢處理器
<pre>
//新建輕拍手勢事件類并添加手勢事件
UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleTap:)];
//哪個view需要添加上手勢事件
[self addGestureRecognizer:gesture];
</pre>
一些相關(guān)的屬性(官方解析)
numberOfTapsRequired----設(shè)置該點擊手勢處理器只處理的點擊次數(shù),默認(rèn)為1
numberOfTouchesRequired----默認(rèn)值為1.需要處理的手指數(shù)
UIPinchGestureRecognizer 縮放
<pre>
// 創(chuàng)建UIPinchGestureRecognizer手勢處理器,該手勢處理器激發(fā)scaleImage方法
UIPinchGestureRecognizer* gesture = [[UIPinchGestureRecognizer alloc]
initWithTarget:self action:@selector(scaleImage:)];
// 為imageView添加手勢處理器
[self.imageView addGestureRecognizer:gesture];
</pre>
一些相關(guān)的屬性
scale----相對于屏幕坐標(biāo)中的觸摸點的比例
velocity----縮放速度/秒
例子-通過捏合手勢縮放圖片
<pre>
- (void) scaleImage:(UIPinchGestureRecognizer*)gesture
{
CGFloat scale = gesture.scale;
// 如果捏合手勢剛剛開始
if (gesture.state == UIGestureRecognizerStateBegan)
{
// 計算當(dāng)前縮放比
currentScale = self.imageView.image.size.width / srcImage.size.width;
}
// 根據(jù)手勢處理的縮放比計算圖片縮放后的目標(biāo)大小
CGSize targetSize = CGSizeMake(srcImage.size.width * scale * currentScale,
srcImage.size.height * scale * currentScale);
// 對圖片進(jìn)行縮放
self.imageView.image = [srcImage imageByScalingToSize:targetSize];
}
</pre>
不多說,直接上Demo例子https://git.oschina.net/qjz.com/pinchImage/tree/master
旋轉(zhuǎn)手勢UIRotationGestureRecognizer
<pre>
//新建旋轉(zhuǎn)手勢事件類并添加手勢事件
UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotatePiece:)];
[self.viewPhoth addGestureRecognizer:rotationGesture];
</pre>
一些相關(guān)的屬性
rotation----旋轉(zhuǎn)的弧度
velocity----縮放速度/秒
旋轉(zhuǎn)圖片的例子
<pre>
- (void) rotateImage:(UIRotationGestureRecognizer*)gesture
{
// 獲取手勢旋轉(zhuǎn)的弧度
CGFloat rotation = gesture.rotation;
// 根據(jù)當(dāng)前縮放比計算圖片縮放后的目標(biāo)大小
CGSize targetSize = CGSizeMake(srcImage.size.width * currentScale,
srcImage.size.height * currentScale);
// 對圖片進(jìn)行縮放、旋轉(zhuǎn)
self.imageView.image = [[srcImage imageByScalingToSize:targetSize]
imageRotatedByRadians:currentRotation + rotation];
// 如果旋轉(zhuǎn)手勢結(jié)束
if(gesture.state == UIGestureRecognizerStateEnded)
{
currentRotation = currentRotation + rotation;
}
}
</pre>
不多說,直接上demo栗子https://git.oschina.net/qjz.com/pinchImage/tree/master
長按手勢UILongPressGestureRecognizer
創(chuàng)建手勢處理器
<pre>
//新建長按手勢事件類并添加手勢事件
UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(viewLongPressGesture:)];
//哪個view需要添加上手勢事件
[self addGestureRecognizer:longGesture];
</pre>
一些相關(guān)的屬性(官方解析)
numberOfTapsRequired----默認(rèn)值為0.在按下手勢識別之前所需的全部點擊數(shù)
numberOfTouchesRequired----默認(rèn)值為1.要識別的手勢必須按住的手指數(shù)
minimumPressDuration----默認(rèn)值為0.5。 以秒為單位的手指必須按住手勢才能識別手勢
allowableMovement----默認(rèn)值為10.手勢失敗前允許的最大移動(以像素為單位)。 一旦識別(在minimumPressDuration之后),對于觸摸跟蹤的剩余部分,手指移動沒有限制
長按手勢中的一些事件
<pre>
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
UIGestureRecognizerStatePossible, //識別器尚未識別其姿勢,但可以是評估觸摸事件。 這是默認(rèn)狀態(tài)
UIGestureRecognizerStateBegan, // 識別器已經(jīng)接收到被識別為手勢的觸摸。 action方法將在下一個運(yùn)行循環(huán)中調(diào)用
UIGestureRecognizerStateChanged, //識別器已經(jīng)接收到被識別為對手勢的改變的觸摸。 action方法將在下一個運(yùn)行循環(huán)中調(diào)用
UIGestureRecognizerStateEnded, // 識別器已經(jīng)接收到被識別為手勢的結(jié)束的觸摸。 action方法將在下一個運(yùn)行循環(huán)中被調(diào)用,識別器將被重置為UIGestureRecognizerStatePossible
UIGestureRecognizerStateCancelled, // 識別器已經(jīng)接收到導(dǎo)致手勢的取消的觸摸。 action方法將在下一個運(yùn)行循環(huán)中調(diào)用。 識別器將被重置為UIGestureRecognizerStatePossible
UIGestureRecognizerStateFailed, // 識別器已經(jīng)接收到不能被識別為手勢的觸摸序列。 將不會調(diào)用操作方法,并且識別器將重置為UIGestureRecognizerStatePossible
// 離散手勢 - 識別離散事件但不報告更改的手勢識別器(例如,輕敲)不會通過“開始”和“已更改”狀態(tài)進(jìn)行切換,也不會失敗或被取消
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 識別器已經(jīng)接收到被識別為手勢的觸摸。 action方法將在下一個運(yùn)行循環(huán)中被調(diào)用,識別器將被重置為UIGestureRecognizerStatePossible
};
</pre>
移動(輕掃)手勢UISwipeGestureRecognizer
<pre>
for (int i = 0 ; i < 4 ; i++)
{
// 創(chuàng)建手勢處理器,指定使用該控制器的handleSwipe:方法處理輕掃手勢
UISwipeGestureRecognizer* gesture = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
// 設(shè)置該點擊手勢處理器只處理i個手指的輕掃手勢
gesture.numberOfTouchesRequired = 1;
// 指定該手勢處理器只處理1 << i方向的輕掃手勢
gesture.direction = 1 << i;
// 為gv控件添加手勢處理器。
[self.gv addGestureRecognizer:gesture];
}
</pre>
一些相關(guān)的屬性值
numberOfTouchesRequired----默認(rèn)值為1.必須滑動的手指數(shù)
@property(nonatomic) UISwipeGestureRecognizerDirection direction ----默認(rèn)為UISwipeGestureRecognizerDirectionRight。 所需的滑動方向。 可以指定多個方向,如果它們將導(dǎo)致相同的行為(例如,UITableView滑動刪除)
補(bǔ)充UISwipeGestureRecognizerDirection一共四個值,分別是右、左、上、下
typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
UISwipeGestureRecognizerDirectionRight = 1 << 0,
UISwipeGestureRecognizerDirectionLeft = 1 << 1,
UISwipeGestureRecognizerDirectionUp = 1 << 2,
UISwipeGestureRecognizerDirectionDown = 1 << 3
};
使用例子:
<pre>
// 實現(xiàn)手勢處理器的方法,該方法應(yīng)該聲明一個形參。
// 當(dāng)該方法被激發(fā)時,手勢處理器會作為參數(shù)傳給該方法的參數(shù)。
- (void) handleSwipe:(UISwipeGestureRecognizer)gesture
{
// 獲取輕掃手勢的方向
NSUInteger direction = gesture.direction;
// 根據(jù)手勢方向的值得到方向字符串
NSString dirStr = direction == UISwipeGestureRecognizerDirectionRight
? @"向右" : (direction == UISwipeGestureRecognizerDirectionLeft
? @"向左" : (direction == UISwipeGestureRecognizerDirectionUp
? @"向上" :@"向下"));
NSUInteger touchNum = gesture.numberOfTouchesRequired;
self.label.text = [NSString stringWithFormat:
@"用戶使用%d個手指進(jìn)行輕掃,方向為:%@" , touchNum , dirStr];
// 指定2秒后清除label的文本
[self.label performSelector:@selector(setText:)
withObject:@"" afterDelay:2];
}
</pre>
不多說,直接上demo栗子https://git.oschina.net/qjz.com/pinchImage/tree/master
一個仿支付寶“更多”長按移動View,動態(tài)動畫的參考Demo https://github.com/wolfhous/HSUpdateApp