IOS中手势UIGestureRecognizer

通常在对视图进行缩放移动等操作的时候我们可以用UIScrollView,因为它里边自带了这些功能,我们要做的就是告诉UIScrollView的几个相关参数就可以了

但是没有实现旋转的手势即UIRotationGestureRecognizer

IOS中手势有很多:

UIRotationGestureRecognizer旋转

UITapGestureRecognizer手指点击

UIPinchGestureRecognizer缩放

UISwipeGestureRecognizer手指快速扫过

UIPanGestureRecognizer手指拖拽移动

UILongPressGestureRecognizer长按

怎么去实现自己的UIScrollView呢,还可以旋转其Content呢?

需要UIRotationGestureRecognizer、UIPinchGestureRecognizer、UIPanGestureRecognizer的组合操作,先实现单个的操作

UIPanGestureRecognizer:

    func panOnView(panGesture:UIPanGestureRecognizer){

        println("PanClick!")
        switch(panGesture.state){
        case .Ended:
            println("end")
        case .Began:
//
            println("began")
//            velocity = CGPoint(x: panGesture.velocityInView(view).x * fps, y: panGesture.velocityInView(view).y * fps)//初始速度
        case .Changed:
            var trans = panGesture.translationInView(view)

            imageCenter!.transform = CGAffineTransformTranslate(imageCenter!.transform, trans.x / currentScale, trans.y / currentScale)
            panGesture.setTranslation(CGPointZero, inView: view)//translate的时候,center和position都不变
        default:
            println("default")
        }
//          adjustAnchorPointForGestureRecognizer(panGesture)
    }

UIPinchGestureRecognizer:

    //缩放
    func pintchOnView(pintchGesture:UIPinchGestureRecognizer){

        currentScale = getViewScale(pintchGesture)
        switch pintchGesture.state{
        case .Began:
        case .Ended:
            println("end")
        case .Changed:
            var scale = pintchGesture.scale
            pintchGesture.view!.transform = CGAffineTransformScale(pintchGesture.view!.transform,scale, scale)
            pintchGesture.scale = 1
        default:
            println("default")
        }

    }

UIPanGestureRecognizer:

    func rotateOnView(rotateGesture:UIRotationGestureRecognizer){
        switch rotateGesture.state{
        case .Began:
        case .Ended:
            println("end")
        case .Changed:
            imageCenter?.transform = CGAffineTransformRotate(imageCenter!.transform, rotateGesture.rotation)
            rotateGesture.rotation = 0
            println("changed")
        default:
            println("default")
        }
    }

组合操作:

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }

一定要实现上面的函数才能组合操作,值得注意的是,因为缩放和旋转都有个中心点的问题,也是常说的瞄点,瞄点不一样,缩放和旋转产生的效果完全不一样

在视图的Layer中有一个属性anchorPoint这个点一般的默认值是(0.5,0.5)值大小是从0~1变化。如何理解瞄点,其实很简单,比如说瞄点是P点,在P处的视图上有一个很小的小花儿(假设有这个参照物),旋转之后无论图形变成什么样子,那个参照物小花儿还是在屏幕的原来的位置。比如P(0.5,0.5)那就是在视图的正中心缩放旋转,(0,0)就是左上角旋转缩放,(1,1)就是右下角缩放旋转。

如果在组合操作的时候不设置瞄点,每次手指操作的位置不同,瞄店都会变化,你不重现设置,很有可能你一旋转,视图都不知道跑哪里去了,所以在所有手势的Begin枚举的时候,应该手动再设置当前手指操作的点作为瞄点

    func adjustAnchorPointForGestureRecognizer(gestureRecognizer:UIGestureRecognizer){
        stopTimer()
        var piece = gestureRecognizer.view
        var locationInView = gestureRecognizer.locationInView(piece)
        var locationInSuperview = gestureRecognizer.locationInView(piece?.superview)
        piece?.layer.anchorPoint = CGPoint(x: locationInView.x / piece!.bounds.size.width, y: locationInView.y / piece!.bounds.size.height)
        piece?.center = locationInSuperview
        var trans = imageCenter!.transform
        imageCenter!.transform = CGAffineTransformTranslate(trans, -trans.tx / currentScale, -trans.ty / currentScale)
        panGestureRecognizer.setTranslation(CGPointZero, inView: view)
    }

惯性:

在很多操作中我们都会看见视图缓动的动画效果,感觉好像视图在受到阻力。很多动画库里边都有这样的效果。但是动画一般都是密封的过程,也就是说假如一个移动动画持续5秒,那么在这五秒结束之前,你不能对其坐标手动赋值,除非你用一个全新的移动动画来代替它。所以常用计时器来自己写一个缓动的动画

var fps:CGFloat = 1 / 60.0//假设在每次fps时间间隔就对对象位置赋值

var factor:CGFloat = 0.95//摩擦系数

var velocity = ?//手指脱离屏幕的瞬间,视图朝某个方向运动的速度,例如移动动画的缓动,将手指抬起的坐标减去抬起之前的上一个坐标,这个距离向量作为初识的速度

定义一个计时器,时间间隔为fps,每隔fps,将velocity累乘一个factor系数。视图的坐标每次就加上velocity,直到velocity=0,终止计时器。不光移动动画可以,任意的动画都可以采用这个方法,简单的实现缓动效果,好处在于,这种动画缓动摩擦系数可以自己控制,而且可以在任意缓动的过程中对对象重新定位动画的属性,只要在之前关闭计时器即可

时间: 2024-08-12 06:09:12

IOS中手势UIGestureRecognizer的相关文章

iOS中手势的delaysTouchesBegan属性用法(挖坑)

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/css/cuteeditor.css);iOS中手势的delaysTouchesBegan属性用法(挖坑),布布扣,bubuko.com

iOS中手势的使用

在iOS中添加手势比较简单,可以归纳为以下几个步骤: 创建对应的手势对象: 设置手势识别属性[可选]: 附加手势到指定的对象: 编写手势操作方法: 为了帮助大家理解,下面以一个图片查看程序演示一下上面几种手势,在这个程序中我们完成以下功能: 如果点按图片会在导航栏显示图片名称: 如果长按图片会显示删除按钮,提示用户是否删除: 如果捏合会放大.缩小图片: 如果轻扫会切换到下一张或上一张图片: 如果旋转会旋转图片: 如果拖动会移动图片: 具体布局草图如下: 为了显示导航条,我们首先将主视图控制器KC

UI: UIGestureRecognizer IOS中手势的用法

UIGestureRecognizer 手势识别器,是常用手势的父类 可以手写代码,也可以拖拽应用手势. 1.触摸Touch 四个方法: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { _label1.text = @"触摸开始"; //1.获得触摸屏幕的手指 UITouch *touch = [touches anyObject]; //2.得到当前手指所在的位置的坐标 _startPoint = [

ios的手势UIGestureRecognizer

一.概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)

iOS开发笔记--iOS中的触摸事件和手势处理

iOS中的事件可以分为三大类:原文:http://my.oschina.net/aofe/blog/268749 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象". UIApplication,UIViewController,UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. UIRespon

iOS手势UIGestureRecognizer识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势) (转)

1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加了移动设备使用便捷性. iOS系统在3.2以后,为方便开发这使用一些常用的手势,提供了UIGestureRecognizer类.手势识别UIGestureRecognizer类是个抽象类,下面的子类是具体的手势,开发这可以直接使用这些手势识别. UITapGestureRecognizer UIPinchGestureRecognizer UIRotationGestureRecog

说说iOS中的手势及触摸

一.响应链 在IOS开发中会遇到各种操作事件,通过程序可以对这些事件做出响应. 首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获得响应事件消息的机会.当发生事件时,事件首先被发送给第一响应者,第一响应者往往是事件发生的视图,也就是用户触摸屏幕的地方.事件将沿着响应者链一直向下传递,直到被接受并做出处理.一般来说,第一响应者是个视图对象或者其子类对

【iOS开发-手势】iOS中各种手势总结

iOS中支持的手势事件 UITapGestureRecognizer(敲击) UIPinchGestureRecognizer(捏合,用于缩放) UIPanGestureRecognizer(拖拽) UISwipeGestureRecognizer(轻扫) UIRotationGestureRecognizer(旋转) UILongPressGestureRecognizer(长按) UITapGestureRecognizer(敲击) //创建UITapGestureRecognizer对象,

iOS中的触摸事件和手势处理

iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象". UIApplication,UIViewController,UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. UIResponder UIResponder内部提供了方法来处理事件; 1> 触摸事件 一