• (五十二)触摸事件初步


    iOS中的事件分为三类:

    1.触摸事件

    2.加速计事件(摇晃等)

    3.远程控制事件(例如线控)


    响应者对象:

    在iOS中不是任何对象都能处理事件,只有继承自UIResponder的对象才能接受和处理消息,称之为“响应者对象”。

    UIApplication、UIViewController、UIView都继承字UIResponder,因此都可以处理事件。

    UIResponder提供了相应的方法来处理各类事件。

    触摸事件以touches开头,注意touchesCancelled方法是被电话等打断触摸过程时,会调用这个方法。

    加速计事件以motion开头。

    远程控制事件以remote开头。


    【UIView的触摸】

    完整的触摸过程:touchesBegan -> touchesMoved -> touchesEnded.

    每一个触摸函数都有两个参数:NSSet对象和UIEvent对象。

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    NSSet是一个无序集合,区别于数组的有序性。

    touches集合装的是UITouch对象,要取出元素,可以使用anyObject方法。

    UITouch:当用户用一根手指触摸屏幕时,会创建一个与手指相关的UITouch对象,每一根手指对应一个UITouch对象。

    UITouch保存着的是触摸的位置、时间、阶段等信息,当手指移动时,会更新同一个UITouch。

    需要注意的是,View默认情况下不支持多点触控,要先更改属性Multiple Touch



    【触摸移动View的样例】

    拿到触摸位置的方法:先拿到touch对象,然后通过locationInView:方法来获得CGPoint对象,坐标原点是locationInView对应的视图左上角。

    拿到当前位置的方法:

    UITouch *touch = [touches anyObject];
    CGPoint current = [touch locationInView:self];
    拿到上一个触摸点位置的方法:

    CGPoint previous = [touch previousLocationInView:self];
    触点移动的方向和距离与View应该移动的方向和距离是一致的,因此只需要用当前点减去上一个点,就可以得到相应的变化量。

    为了方便改变View的位置,可以使用center属性,center的x、y变化量为两次触摸点坐标的变化量Δx和Δy

    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [touches anyObject];
        // 当前触摸点
        CGPoint current = [touch locationInView:self];
        // 上一个触摸点
        CGPoint previous = [touch previousLocationInView:self];
        // 修改当前view的位置(中点)
        CGPoint center = self.center;
        center.x += current.x - previous.x;
        center.y += current.y - previous.y;
        self.center = center;
    }

    需要注意的是,如果是UIViewController方法要捕捉触摸事件,传入的为self.view,方法只接收View对象

    除去NSSet对象,还有一个UIEvent对象,表示的是事件的一些属性,例如有类型属性表示事件的类型(例如调整音量)。

    Tip:一次完整的触摸过程中,只会产生一个事件对象。

    Tip:两根手指同时触摸同一个view,只调一次touchesBegan:withEvent方法,touches中有两个UITouch对象储存两根手指的触控信息;如果是一前一后的触摸同一个view,则会调用两次touchesBegan...方法,并且每次touches中只有一个UITouch对象;touches中的UITouch个数可以判断是单点触摸还是多点触摸。

    Tip:UITouch中有window、view属性判断触摸产生时所处的窗口和视图,tapCount可以记录短时间内点按屏幕的次数(判断单击、双击等),phase可以得到触摸事件所处的状态(Began、Moves、Ended)。




  • 相关阅读:
    表格的交集合集等的命令处理
    Linux中screen命令
    Linux中sed基础
    Linux中AWK基础
    聊聊开发中经历的几种后端语言
    C语言NXP S32K144 serial bootloader和C#语言bootloader PC端串口通信程序
    自己用C语言写NXP S32K144 serial bootloader
    C语言NXP S32K116 serial bootloader和C#语言bootloader PC端串口通信程序
    自己用C语言写NXP S32K116 serial bootloader
    C语言RH850 F1L serial bootloader和C#语言bootloader PC端串口通信程序
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154199.html
Copyright © 2020-2023  润新知