IOS各種手勢操作執行個體,IOS手勢操作執行個體
先看下效果
手勢相關的介紹
IOS中手勢操作一般是 UIGestureRecognizer 類的幾個手勢子類去實現,一般我們用到的手勢就這麼5種:
1、點擊 UITapGestureRecognizer
2、平移 UIPanGestureRecognizer
3、縮放 UIPinchGestureRecognizer
4、旋轉 UIRotationGestureRecognizer
5、輕掃 UISwipeGestureRecognizer
我們上面這個執行個體中就用到了上面這5種手勢,不過其中 點擊與輕掃沒有體現出來,只是輸出了下日誌而已,一會看代碼
下面我們來分別介紹下這幾種手勢
1、UITapGestureRecognizer 點選手勢
UITapGestureRecognizer* tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGes:)];// 點擊次數,預設為1,1為單擊,2為雙擊tapGes.numberOfTapsRequired = 2;
這個點選手勢類有一個屬性 numberOfTapsRequired 用於設定點擊數,就是點擊幾次才觸發這個事件
2、UIPanGestureRecognizer 平移手勢
// 平移手勢- (void)initPanGes{ UIPanGestureRecognizer* panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGes:)]; [self.imgView addGestureRecognizer:panGes];}- (void)panGes:(UIPanGestureRecognizer*)ges{ // 擷取平移的座標點 CGPoint transPoint = [ges translationInView:self.imgView];}
平移手勢本身沒太多可設定的屬性,在平移事件觸發手,可以用 translationInView 方法擷取當前平移座標點
3、UIPinchGestureRecognizer 縮放手勢
// 縮放手勢- (void)initPinGes{ UIPinchGestureRecognizer* pinGes = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinGes:)]; [self.imgView addGestureRecognizer:pinGes];}- (void)pinGes:(UIPinchGestureRecognizer*)ges{ // 縮放 self.imgView.transform = CGAffineTransformScale(self.imgView.transform, ges.scale, ges.scale);}
縮放手勢在事件裡面可以擷取 scale 屬性,表示當前縮放值
4、UIRotationGestureRecognizer 旋轉手勢
// 旋轉手勢- (void)initRotation{ UIRotationGestureRecognizer* rotationGes = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGes:)]; [self.imgView addGestureRecognizer:rotationGes];}- (void)rotationGes:(UIRotationGestureRecognizer*)ges{ // 旋轉圖片 self.imgView.transform = CGAffineTransformRotate(self.imgView.transform, ges.rotation);}
旋轉手勢在事件裡面可以通過擷取 rotation 屬性擷取當前旋轉的角度
5、UISwipeGestureRecognizer 撥動手勢
// 撥動手勢- (void)initSwipeGes{ // 建立 從右向左 輕掃的手勢 UISwipeGestureRecognizer* swipeLeftGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)]; // 方向,預設是從左往右 // 最多隻能開啟一個手勢,如果要開啟多個就得建立多個手勢 // 監聽從右向左的方向 swipeLeftGes.direction = UISwipeGestureRecognizerDirectionLeft; [self.imgView addGestureRecognizer:swipeLeftGes];}- (void)swipeGes:(UISwipeGestureRecognizer*)ges{ // ges.direction方向值 NSLog(@"%s diection:%lu",__func__,(unsigned long)ges.direction);}
撥動手勢對象需要設定 direction 屬性,預設是只監聽從左向右,這是一個枚舉值 UISwipeGestureRecognizerDirection
UISwipeGestureRecognizerDirectionRight 從左向右(預設值)
UISwipeGestureRecognizerDirectionLeft 從右向左
UISwipeGestureRecognizerDirectionUp 從下向上
UISwipeGestureRecognizerDirectionDown 從上向下
下面看一下我們上面那個實現代碼吧
//// ViewController.m// 各種手勢操作//// Created by xgao on 16/3/24.// Copyright © 2016年 xgao. All rights reserved.//#import "ViewController.h"@interface ViewController ()<UIGestureRecognizerDelegate>@property (weak, nonatomic) IBOutlet UIImageView *imgView;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; [self initTapGes]; [self initPanGes]; [self initPinGes]; [self initRotation]; [self initSwipeGes];}// 點選手勢- (void)initTapGes{ UITapGestureRecognizer* tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGes:)]; // 點擊次數,預設為1,1為單擊,2為雙擊 tapGes.numberOfTapsRequired = 2; tapGes.delegate = self; [self.imgView addGestureRecognizer:tapGes];}- (void)tapGes:(UITapGestureRecognizer*)ges{ NSLog(@"%s",__func__);}// 平移手勢- (void)initPanGes{ UIPanGestureRecognizer* panGes = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGes:)]; panGes.delegate = self; [self.imgView addGestureRecognizer:panGes];}- (void)panGes:(UIPanGestureRecognizer*)ges{ // 擷取平移的座標點 CGPoint transPoint = [ges translationInView:self.imgView]; // 在之前的基礎上移動圖片 self.imgView.transform = CGAffineTransformTranslate(self.imgView.transform, transPoint.x, transPoint.y); // 複原,必需複原 // 每次都清空一下消除座標疊加 [ges setTranslation:CGPointZero inView:self.imgView]; NSLog(@"%s",__func__);}// 縮放手勢- (void)initPinGes{ UIPinchGestureRecognizer* pinGes = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinGes:)]; pinGes.delegate = self; [self.imgView addGestureRecognizer:pinGes];}- (void)pinGes:(UIPinchGestureRecognizer*)ges{ // 縮放 self.imgView.transform = CGAffineTransformScale(self.imgView.transform, ges.scale, ges.scale); // 複原 // 每次都清空一下消除疊加 ges.scale = 1;}// 旋轉手勢- (void)initRotation{ UIRotationGestureRecognizer* rotationGes = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationGes:)]; rotationGes.delegate = self; [self.imgView addGestureRecognizer:rotationGes];}- (void)rotationGes:(UIRotationGestureRecognizer*)ges{ // 旋轉圖片 self.imgView.transform = CGAffineTransformRotate(self.imgView.transform, ges.rotation); // 複原 // 每次都清空一下消除疊加 ges.rotation = 0; NSLog(@"%s",__func__);}// 撥動手勢- (void)initSwipeGes{ // 建立 從右向左 輕掃的手勢 UISwipeGestureRecognizer* swipeLeftGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)]; // 方向,預設是從左往右 // 最多隻能開啟一個手勢,如果要開啟多個就得建立多個手勢 // 監聽從右向左的方向 swipeLeftGes.direction = UISwipeGestureRecognizerDirectionLeft; swipeLeftGes.delegate = self; [self.imgView addGestureRecognizer:swipeLeftGes]; // 建立 從下向上 輕掃的手勢 UISwipeGestureRecognizer* swipeUpGes = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeGes:)]; // 監聽從下向上的方向 swipeUpGes.direction = UISwipeGestureRecognizerDirectionUp; swipeUpGes.delegate = self; [self.imgView addGestureRecognizer:swipeUpGes];}- (void)swipeGes:(UISwipeGestureRecognizer*)ges{ // ges.direction方向值 NSLog(@"%s diection:%lu",__func__,(unsigned long)ges.direction);}#pragma mark - UIGestureRecognizerDelegate// 判斷是否能觸發手勢- (BOOL)gestureRecognizerShouldBegin:(UITapGestureRecognizer *)gestureRecognizer{ return YES;}// 是否允許多手勢操作,不是多觸摸點- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES;}@end
這裡需要注意的有兩點:
1、對於 平移、縮放、旋轉 這3個手勢,我們如果要用它的值去處理的話,要記得複原!複原!複原!這點很重要!重要的事說3遍~~
平移手勢裡面我們需要設定 setTranslation:CGPointZero 來複原它的座標值,不然下一次事件觸發這個座標值會疊加
縮放手勢裡面設定 ges.scale = 1 來複原它的縮放值
旋轉手勢裡面設定 ges.rotation = 0 來複原它的角度值
2、假如我們需要多手勢一起用的時候就需要設定下delegate 裡面的一個返回參數的方法了
// 是否允許多手勢操作,不是多觸摸點- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES;}
這次分享就到這裡~~有什麼不清楚的,就留言吧 ^_^