1、UITouch简介

  • 当用户触摸屏幕时,会创建一个UITouch对象;
  • UITouch的作用保存着触摸相关的信息,比如触摸的位置、时间、阶段等;
  • 当从开始到结束,系统会更新UITouch对象,结束时会被销毁。
  • 期间所有的UITouch对象都被包含在UIEvent事件对象中,由管理程序UIApplication对象将事件分发。

2、触摸事件调用方法

//响应触摸事件
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;//手指按下的时候调用
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;//手指移动的时候调用
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;//手指抬起的时候调用
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;//取消(非正常离开屏幕,意外中断)
- (void)touchesEstimatedPropertiesUpdated:(NSSet<UITouch *> *)touches NS_AVAILABLE_IOS(9_1);// Apple Pencil 产生的 touch 事件的部分信息(如 Pencil 的方向等)传递到 iPad 或 iPhone 上会有一定的延时。
//UIKit 的回调方法 touchBegan 是立即产生的,其返回的参数 touch 中包含了 Pencil 产生的额外信息,这个额外信息是有延时的。所以,首次回调时会给出额外信息的预估值,延时获取真实值之后会调用 touchesEstimatedPropertiesUpdated 方法更新额外信息。

3、UITouch相关API

//
// UITouch.h
// UIKit
//
// Copyright (c) 2007-2017 Apple Inc. All rights reserved.
// #import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <UIKit/UIKitDefines.h> NS_ASSUME_NONNULL_BEGIN @class UIWindow, UIView, UIGestureRecognizer; typedef NS_ENUM(NSInteger, UITouchPhase) {
UITouchPhaseBegan, // 开始触摸
UITouchPhaseMoved, // 移动
UITouchPhaseStationary, // 停留
UITouchPhaseEnded, // 结束
UITouchPhaseCancelled, // 取消
}; typedef NS_ENUM(NSInteger, UIForceTouchCapability) {
UIForceTouchCapabilityUnknown = , // 3D Touch检测失败
UIForceTouchCapabilityUnavailable = , // 3D Touch不可用
UIForceTouchCapabilityAvailable = // 3D Touch可用
}; typedef NS_ENUM(NSInteger, UITouchType) {
UITouchTypeDirect, // 手指和屏幕直接接触
UITouchTypeIndirect, // 间接接触(不直接接触屏幕)
UITouchTypeStylus NS_AVAILABLE_IOS(9_1), // 笔触
} NS_ENUM_AVAILABLE_IOS(9_0); typedef NS_OPTIONS(NSInteger, UITouchProperties) {
UITouchPropertyForce = (1UL << ), //力度
UITouchPropertyAzimuth = (1UL << ), //方位
UITouchPropertyAltitude = (1UL << ), //高度
UITouchPropertyLocation = (1UL << ), //位置
} NS_AVAILABLE_IOS(9_1); NS_CLASS_AVAILABLE_IOS(2_0) @interface UITouch : NSObject @property(nonatomic,readonly) NSTimeInterval timestamp; // 时间
@property(nonatomic,readonly) UITouchPhase phase; // 状态
@property(nonatomic,readonly) NSUInteger tapCount; // 点击次数
@property(nonatomic,readonly) UITouchType type NS_AVAILABLE_IOS(9_0); //接触类型 // 接触面积的半径
// 接触半径的误差
@property(nonatomic,readonly) CGFloat majorRadius NS_AVAILABLE_IOS(8_0);
@property(nonatomic,readonly) CGFloat majorRadiusTolerance NS_AVAILABLE_IOS(8_0); @property(nullable,nonatomic,readonly,strong) UIWindow *window; //触摸所在窗口
@property(nullable,nonatomic,readonly,strong) UIView *view; //触摸所在视图
@property(nullable,nonatomic,readonly,copy) NSArray <UIGestureRecognizer *> *gestureRecognizers NS_AVAILABLE_IOS(3_2); //触摸手势 - (CGPoint)locationInView:(nullable UIView *)view; //在view上的触摸位置
- (CGPoint)previousLocationInView:(nullable UIView *)view; //记录前一个触摸点的在view上的位置,view为nil就是整个窗口 //现在触摸的精确的坐标
//上一次触摸的精确的坐标
- (CGPoint)preciseLocationInView:(nullable UIView *)view NS_AVAILABLE_IOS(9_1);
- (CGPoint)precisePreviousLocationInView:(nullable UIView *)view NS_AVAILABLE_IOS(9_1); // 触摸压力值
@property(nonatomic,readonly) CGFloat force NS_AVAILABLE_IOS(9_0);
// 最大触摸压力值
@property(nonatomic,readonly) CGFloat maximumPossibleForce NS_AVAILABLE_IOS(9_0); //沿着x轴正向的方位角,当与x轴正向方向相同时,该值为0;当view参数为nil时,默认为keyWindow返回触针的方位角(弧度)。
- (CGFloat)azimuthAngleInView:(nullable UIView *)view NS_AVAILABLE_IOS(9_1);
//当前触摸对象的方向上的单位向量当view参数为nil时,默认为keyWindow返回在触针的方位角的方向指向的单位矢量。
- (CGVector)azimuthUnitVectorInView:(nullable UIView *)view NS_AVAILABLE_IOS(9_1); //当笔平行于平面时,该值为0
//当笔垂直于平面时,该值为Pi / 2
//触针的高度(单位为弧度)。
@property(nonatomic,readonly) CGFloat altitudeAngle NS_AVAILABLE_IOS(9_1); //当每个触摸对象的触摸特性发生变化时,该值将会单独增加,返回值是NSNumber 索引号,让您关联与原来的触摸更新的联系
@property(nonatomic,readonly) NSNumber * _Nullable estimationUpdateIndex NS_AVAILABLE_IOS(9_1);
//当前触摸对象估计的触摸特性,返回值是UITouchPropertyies一组触摸属性,这些属性将得到更新。
@property(nonatomic,readonly) UITouchProperties estimatedProperties NS_AVAILABLE_IOS(9_1);
//一组期望在未来的更新报文的触摸性能。
@property(nonatomic,readonly) UITouchProperties estimatedPropertiesExpectingUpdates NS_AVAILABLE_IOS(9_1); @end NS_ASSUME_NONNULL_END

UITouch相关API

4、其它

  4.1、类型:直接接触、隔空、笔触;

typedef NS_ENUM(NSInteger, UITouchType) {
UITouchTypeDirect, // 手指和屏幕直接接触
UITouchTypeIndirect, // 间接接触(不直接接触屏幕)
UITouchTypeStylus NS_AVAILABLE_IOS(9_1), // 笔触
} NS_ENUM_AVAILABLE_IOS(9_0);

  4.2、多点触控:重写 isMultipleTouchEnabled 返回为YES

- (BOOL)isMultipleTouchEnabled{
return YES;
}

  4.3、视图上多个Button单独触发

- (BOOL)isExclusiveTouch{
return YES;
}

  4.4、同时设置 isMultipleTouchEnabled 和 isExclusiveTouch时,isExclusiveTouch无效。

5、简单使用

  5.1、获取一个UITouch对象

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
UITouch * touch = [touches anyObject];
}

  5.2、开启多点触控获取touches集合

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//获取所有的触摸对象
NSArray * array = [touches allObjects];
}

iOS开发UITouch触摸API简介的更多相关文章

  1. iOS开发UI篇—CALayer简介

    iOS开发UI篇—CALayer简介   一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实 ...

  2. iOS开发之多媒体API(1)

    iOS开发之多媒体API(1)       播放视频 视频文件介绍 视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类.尽管后者在播放的稳定性和播放画面质量上可能没 ...

  3. iOS开发多线程篇—多线程简介

    iOS开发多线程篇-多线程简介 一.进程和线程 1.什么是进程 进程是指在系统中正在执行的一个应用程序 每一个进程之间是独立的.每一个进程均执行在其专用且受保护的内存空间内 比方同一时候打开QQ.Xc ...

  4. iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...

  5. 转发:iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 转载来自崔江涛(KenshinCui) 链接:http://www.cnblogs.com/kenshincui/p/3950646.html 概览 iPhone的成功很大一 ...

  6. iOS开发进阶--1.多线程简介

    学习是由已知的知识模型推理未知的知识模型的的过程. 本文适合学习完objective-c基础,想进一步提高做iOS开发的同学阅读. 在说线程的时候,我们先看看进程. 1.进程 每一个运行在系统中的应用 ...

  7. iOS开发多线程篇—GCD简介

    iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...

  8. iOS开发之触摸事件及手势

    1.iOS中的事件 在用户使用app过程中,会产生各种各样的事件,iOS中的事件可以分为3大类型: 2.响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并 ...

  9. iOS开发之多媒体API (转载)

    视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类.尽管后者在播放的稳定性和播放画面质量上可能没有前者 优秀,但网络流媒体影像视频的广泛传播性使之正被广泛应用于视频 ...

随机推荐

  1. 树分基础 bzoj 1468

    我们对于一棵树,我们找一个根,然后统计过这个点的路径有多少符合要求.怎么搞呢?我们可以先维护一个数据结构,然后把先把根作为一个距离自己为0的点放进去,然后对于每一棵子树,先找出所有的与之前的数据结构的 ...

  2. A*启发式搜索基础

    A*启发式搜索基础 传统的搜索方式是盲目搜索,即到每一步的时候并没有对每种情况进行有效的区分,这样的结果是浪费了大量的时间,对很多没有必要的数据进行了搜索. 而A*算法则在搜索的过程中会选取认为“最优 ...

  3. sqlmap用户手册详解【实用版】

    网上的sqlmap教程很多,但是我自己备忘小笔记都是在我的电脑上存着了,万一我要出去玩的时候,有点忘了,还得再百度翻翻,还不如发到我自己知乎上,忘了立马一看就记着了.虽说我的sqlmap备忘小笔记汇总 ...

  4. linux进阶之路(二):linux文件目录

    Linux的目录结构: Linux文件系统采用级层式的目录结构,最上层是根目录"/",在此目录下再创建其他目录. 树状的文件目录.再Linux世界,一切皆文件. /etc 所有系统 ...

  5. Java 反射获取私有方法

    通常我们创建一个类时,它的私有方法在类外是不可见的,但是可以通过反射机制来获取调用.具体的反射机制的介绍大家自己百度. 所以反射可能会破坏我们的单例模式,当然解决方案也是有的,就是做个标记记录次数,第 ...

  6. strcmp 和 strcoll的区别

    功能和strcmp类似,用法也一样.   特别注意:strcoll()会依环境变量LC_COLLATE所指定的文字排列次序来比较s1和s2 字符串.   strcmp是根据ASCII来比较2个串的.  ...

  7. MySQL 8.0及以上版本设置密码

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

  8. LCA的RMQ求法

    参考博客 仔细想一想:最近的公共祖先,其实,搜索时回朔,连通这两点,那深度最低肯定是最近的公共祖先啊. 那这样就可以变成RMQ问题了. #include<stdio.h> #include ...

  9. Boring counting HDU - 3518 后缀自动机

    题意: 对于给出的字符串S, 长度不超过1000, 求其中本质不同的子串的数量, 这些子串满足在字符串S中出现了至少不重合的2次 题解: 将串放入后缀自动机中然后求出每一个节点对应的子串为后缀的子串出 ...

  10. 8u ftp 可以连接但是无法获取目录的解决办法:无法打开传输通道。原因:由于...

    来自: http://www.3566t.com/news/dlsn/1557906.html 状态:  正在取得目录列表... 命令:  CWD xinghun 响应:  250 OK. Curre ...