UIGestureRecognizer手势识别_藏经阁

UIGestureRecognizer

一、前言

iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式:

但是这种方式甄别不同的手势操作实在是麻烦,需要你自己计算做不同的手势分辨。后来苹果就给出了一个比较简便的方式,就是使用UIGestureRecognizer


二、UIGestureRecognizer

UIGestureRecognizer基类是一个抽象类,我们主要是使用它的子类(名字包含链接,可以点击跳到ios Developer library,看官方文档):

从名字上我们就能知道Tap(点击)、Pinch(捏合)、Rotation(旋转)、Swipe(滑动,快速移动,是用于监测滑动的方向的)、Pan (拖移,慢速移动,是用于监测偏移的量的)以及 LongPress(长按)。


三、上代码才是硬道理

import UIKit
class ViewController: UIViewController {   
    @IBOutlet var im: UIImageView!
    var lastScaleFactor : CGFloat! = 1  //放大、缩小
    var netRotation : CGFloat = 0;//旋转
    var netTranslation : CGPoint = CGPoint(x: 0, y: 0)//平移
    var images : NSArray = ["1","2","3"]// 图片数组
    var imageIndex : Int = 0 //数组下标   
    override func viewDidLoad() {
        super.viewDidLoad()   
        let tapGesture = UITapGestureRecognizer(target: self, action: "handleTapGesture:")
        //设置手势点击数,双击:点2下
        tapGesture.numberOfTapsRequired = 2
        self.view.addGestureRecognizer(tapGesture)
        
        //手势为捏的姿势:按住option按钮配合鼠标来做这个动作在虚拟器上
        let pinchGesture = UIPinchGestureRecognizer(target: self, action: "handlePinchGesture:")
        self.view.addGestureRecognizer(pinchGesture)
        
        //旋转手势:按住option按钮配合鼠标来做这个动作在虚拟器上
        let rotateGesture = UIRotationGestureRecognizer(target: self, action: "handleRotateGesture:")
        self.view.addGestureRecognizer(rotateGesture)
        
        //拖手势  同一对象加入托手势时,滑动手势不能用。
        let panGesture = UIPanGestureRecognizer(target: self, action: "handlePanGesture:")
        self.view.addGestureRecognizer(panGesture)
        
        //划动手势
        //右划
        let swipeGesture = UISwipeGestureRecognizer(target: self, action: "handleSwipeGesture:")
        self.view.addGestureRecognizer(swipeGesture)
        //左划
        let swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: "handleSwipeGesture:")
        swipeLeftGesture.direction = UISwipeGestureRecognizerDirection.Left //不设置是右
        self.view.addGestureRecognizer(swipeLeftGesture)
        
        //长按手势
        let longpressGesutre = UILongPressGestureRecognizer(target: self, action: "handleLongpressGesture:")
        //长按时间为1秒
        longpressGesutre.minimumPressDuration = 1
        //允许15秒运动
        longpressGesutre.allowableMovement = 15
        //所需触摸手指个数
        longpressGesutre.numberOfTouchesRequired = 2
        self.view.addGestureRecognizer(longpressGesutre)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    //双击屏幕时会调用此方法,放大和缩小图片
    func handleTapGesture(sender: UITapGestureRecognizer){
        //判断imageView的内容模式是否是UIViewContentModeScaleAspectFit,该模式是原比例,按照图片原时比例显示大小
        if im.contentMode == UIViewContentMode.ScaleAspectFit{
            //把imageView模式改成UIViewContentModeCenter,按照图片原先的大小显示中心的一部分在imageView
            im.contentMode = UIViewContentMode.Center
        }else{
            im.contentMode = UIViewContentMode.ScaleAspectFit
        }
    }
    
    //捏的手势,使图片放大和缩小,捏的动作是一个连续的动作
    func handlePinchGesture(sender: UIPinchGestureRecognizer){
        let factor = sender.scale
        if sender.state == .Began{
            print(factor)
        }
        if sender.state == .Changed{
            print(factor)
        }
        im.transform = CGAffineTransformMakeScale(lastScaleFactor*factor, lastScaleFactor*factor)
        //状态是否结束,如果结束保存数据
        if sender.state == UIGestureRecognizerState.Ended{
            lastScaleFactor = lastScaleFactor * factor
        }
    }
    
    //旋转手势
    func handleRotateGesture(sender: UIRotationGestureRecognizer){
        //浮点类型,得到sender的旋转度数
        let rotation : CGFloat = sender.rotation
        if sender.state == .Changed{
            print(rotation)
        }
        //旋转角度CGAffineTransformMakeRotation,改变图像角度
        im.transform = CGAffineTransformMakeRotation(rotation+netRotation)
        //状态结束,保存数据
        if sender.state == UIGestureRecognizerState.Ended{
            netRotation += rotation
        }
    }
    //拖手势
    func handlePanGesture(sender: UIPanGestureRecognizer){
        //得到拖的过程中的xy坐标
        
        let translation : CGPoint = sender.translationInView(im)
        //平移图片CGAffineTransformMakeTranslation
        im.transform = CGAffineTransformMakeTranslation(netTranslation.x+translation.x, netTranslation.y+translation.y)
        if sender.state == UIGestureRecognizerState.Ended{
            netTranslation.x += translation.x
            netTranslation.y += translation.y
        }
    }
    //划动手势
    func handleSwipeGesture(sender: UISwipeGestureRecognizer){
        //划动的方向
        let direction = sender.direction
        //判断是上下左右
        switch (direction){
        case UISwipeGestureRecognizerDirection.Left:
            print("Left")
            imageIndex++;//下标++
            break
        case UISwipeGestureRecognizerDirection.Right:
            print("Right")
            imageIndex--;//下标--
            break
        case UISwipeGestureRecognizerDirection.Up:
            print("Up")
            break
        case UISwipeGestureRecognizerDirection.Down:
            print("Down")
            break
        default:
            break;
        }
        //得到不越界不<0的下标
        imageIndex = imageIndex < 0 ? images.count-1:imageIndex%images.count
        //imageView显示图片
        im.image = UIImage(named: images[imageIndex] as! String)
    }
    
    //长按手势
    func handleLongpressGesture(sender : UILongPressGestureRecognizer){
        
        if sender.state == UIGestureRecognizerState.Began{
            //创建警告
            let alertV = UIAlertController(title: "长按", message: "开始了", preferredStyle: UIAlertControllerStyle.Alert)
            let alertA = UIAlertAction(title: "OK", style: .Destructive, handler: nil)
            alertV.addAction(alertA)
            self.presentViewController(alertV, animated: true, completion: nil)
        }
    }
}

四、很多时候设置代理很重要

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,030评论 5 464
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,198评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,995评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,973评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,869评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,766评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,967评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,599评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,886评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,901评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,728评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,504评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,967评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,128评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,445评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,018评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,224评论 2 339

推荐阅读更多精彩内容