• ##DAY4 事件的基本概念、触摸的基本概念、响应者链、手势


    ##DAY4  事件的基本概念、触摸的基本概念、响应者链、手势

    #pragma mark ———————事件的基本概念 ———————————

    事件的基本概念:

    1)事件是当用户的手指触击屏幕及在屏幕上移动时,系统不断发送给应用程序的对象。

    2)系统将事件按照特定的路径传递给可以对其进行处理的对象。

    3)在iOS中,一个UITouch对象表示一个触摸,一个UIEvent对象表示一个事件。事件对象中包含与当前多点触摸序列相对应的所有触摸对象,还可以提供与特定视图或窗口相关联的触摸对象。

    事件类型:触摸事件、晃动事件、远程事件

    #pragma mark ———————触摸的基本概念———————————

    触摸的基本概念:

    1)触摸信息有时间和空间两方面,时间方面的信息称为阶段 (phrase),表示触摸是否刚刚开始、是否正在移动或处于静止状态,以及何时结束—也就是手指何时从屏幕抬起。

    2)触摸信息还包括当前在视图或窗口中的位置信息,以及之前的位置信息(如果有的话)。

    3)当一个手指接触屏幕时, 触摸就和某个窗口或视图关联在一起,这个关联在事件的整个生命周期都会得到维护。

    触摸事件的处理方法:

    在给定的触摸阶段中,如果发生新的触摸动作或已有的触摸动作发生变化,应用程序就会发送这些消息:

    1)当一个或多个手指触碰屏幕时,发送touchesBegan:withEvent:消息。

    2)当一个或多个手指在屏幕上移动时,发送touchesMoved:withEvent:消息。

    3)当一个或多个手指离开屏幕时,发送touchesEnded:withEvent:消息。

    关于触摸,重要的几个方法:

    1)获取触摸在屏幕上的手指对象:

    UITouch *touch = [touches anyObject];

    2)获取手指之前在屏幕上的位置:

    CGPoint previousP = [touch previousLocationInView:self];

    3)获取手指现在在屏幕上的位置:

    CGPoint currentP = [touch locationInView:self];

    #pragma mark ———————响应者链———————————

    响应者链:

    检测碰撞视图:

    UIApplication -> window -> viewController -> view -> 检测所有子视图

    处理触摸事件:

    触摸的子视图 -> view -> viewController -> window -> UIApplication

    阻断响应者链:

    视图类的属性:userInteractionEnabled。关闭后能阻断查询过程。

    注意:

    1)响应者链阻断后,完成不了检测过程。检测过程完成不了,所以事件就触发不了

    2)而控件阻断响应者链就是关闭用户交互,默认关闭用户交互的控件有UIImageView和UILabel

    3)以后的项目开发中,如果想让UIImageView和UILabel响应事件,必须将其交互打开

    #pragma mark ———————手势———————————

    手势:

    手势识别器是iOS中比较抽象的一个类,用于识别一个手势,所谓手势:有规律的触摸。

    1)创建满足需求的手势,在创建时关联手势触发时的方法

    2)配置手势的相关属性

    3)将手势添加到需要执行的操作视图上面

    4)实现手势方法,当发生触摸,手势识别器识别相应的触摸时,就会发生关联的方法

    手势分类:

    轻拍手势:UITapGestureRecognizer

    属性:numberOfTouchesRequired:触发手势的手指个数

    numberOfTapsRequired:触发手势的轻拍次数

    轻扫手势:UISwipeGestureRecognizer

    属性:direction 设置轻扫方向

    长按手势:UILongpreesGestureRecongnzier

    属性:minimumPressDuration 长按手势触发的最短时间,默认0.5

    平移手势:UIPanGestureRecognizer

    缩放手势:UIPinchGestureRecognizer

    旋转手势:UIRotationGestureRecognizer

    屏幕边界手势:

    UIScreenEdgePanGestureRecognizer

    注意:前三个有属性,后三个没有

    手势的使用:

    1)初始化:

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];

    2)设置属性:…

    3)将手势加到需要通过触摸改变的视图上:

    [imageView addGestureRecognizer:tap];

    4)实现创建手势时添加的方法:

    - (void)tapAction:(UITapGestureRecognizer *)tap {

        //获取手势关联的视图

        UIImageView *imageView = (UIImageView *)tap.view; //强转

        //修改图片

        [imageView setImage:[UIImage imageNamed:@"mao.jpg"]];

    }

    注意后三个手势方法实现:

    平移手势:UIPanGestureRecognizer

    - (void)panAction(UIPanGestureRecognizer *)pan{

        //获取手势关联的视图

        UIImageView *imageView = (UIImageView *)pan.view;

        CGPoint p = [pan translationInView:imageView];

        

        //改变imageView的形变属性

        //1、发生回弹

        //    imageView.transform = CGAffineTransformMakeTranslation(p.x, p.y);

        //2、不发生回弹

        imageView.transform = CGAffineTransformTranslate(imageView.transform, p.x, p.y);

        

        //    CGPointZero 清零

        [pan setTranslation:CGPointZero inView:imageView];

    }

    缩放手势:UIPinchGestureRecognizer

    - (void)pinchAction:(UIPinchGestureRecognizer *)pinch{

        //获取手势关联的视图

        UIImageView *imageView = (UIImageView *)pinch.view;

        

        //改变imageView的形变属性

        //1、发生回弹,再次改变的时候会回到原来的基础上,然后改变

        //    imageView.transform = CGAffineTransformMakeScale(pinch.scale, pinch.scale);

        //仿射变换

        //2、不发生回弹,根据CGAffineTransformScale 中的imageView.transform,进行缩放

        imageView.transform = CGAffineTransformScale(imageView.transform, pinch.scale, pinch.scale);

        

        //如果不设定,会发生累加

        pinch.scale = 1;

    }

    旋转手势:UIRotationGestureRecognizer

    - (void)rotationAction:(UIRotationGestureRecognizer *)rotate{

        //获取手势关联的视图

        UIImageView *imageView = (UIImageView *)rotate.view;

        

        //改变imageView的形变属性

        //1、发生回弹

        //    imageView.transform = CGAffineTransformMakeRotation(rotate.rotation);

        //2、不发生回弹

        imageView.transform = CGAffineTransformRotate(imageView.transform, rotate.rotation);

        

        //如果不设定,会发生累加

        rotate.rotation = 0;

    }

  • 相关阅读:
    angularjs1.6.4中使用ng-table出现data.slice is not a function的问题
    使用sql语句获取数据库表的信息
    IIS部署web,字体404的问题
    SQL中partition关键字的使用
    asp.net 配置二级域名的共享session,并实现sso单点登录
    同一浏览器中同一JavaWeb程序不共享session方法
    Liquibase的使用
    对象并不一定都是在堆上分配内存的
    阿里面试题,为什么wait()方法要放在同步块中?
    粗浅看 Tomcat系统架构分析
  • 原文地址:https://www.cnblogs.com/chongyu/p/5192425.html
Copyright © 2020-2023  润新知