iOS开发UITouch触摸API简介

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 = 0,          // 3D Touch检测失败
    UIForceTouchCapabilityUnavailable = 1,      // 3D Touch不可用
    UIForceTouchCapabilityAvailable = 2         // 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 << 0),      //力度
    UITouchPropertyAzimuth = (1UL << 1),    //方位
    UITouchPropertyAltitude = (1UL << 2),   //高度
    UITouchPropertyLocation = (1UL << 3),   //位置
} 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];
}

原文地址:https://www.cnblogs.com/xianfeng-zhang/p/9468235.html

时间: 2024-10-31 07:20:35

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

IOS开发之触摸背景关闭键盘的代码实现

直接上代码: // 触摸背景,关闭键盘 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; UIView *view = (UIView *)[touch view]; if (view == self.view) { [weightTextField resignFirstResponder]; } } 以上代码是在一个viewContro

iOS开发UI篇—CAlayer简介

iOS开发UI篇—CALayer简介 一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层 @property(nonatomic,readonly,retain) CALayer *layer; 当

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

iOS开发多线程篇-多线程简介 一.进程和线程 1.什么是进程 进程是指在系统中正在执行的一个应用程序 每一个进程之间是独立的.每一个进程均执行在其专用且受保护的内存空间内 比方同一时候打开QQ.Xcode,系统就会分别启动2个进程 通过"活动监视器"能够查看Mac系统中所开启的进程 2.什么是线程 1个进程要想运行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本运行单元,一个进程(程序)的全部任务都在线程中运行 比方使用酷狗播放音乐.使用迅雷下载电影,都须要在线程中

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

-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事件(手势操作).运动事件.远程控制事件等展开学习: iOS事件简介 触摸事件 手势识别 运动事件 远程控制事件 iOS事件 在iOS中事件分为三类: 触摸事件:通过触摸.手势进行触发(例如手指点击.缩放) 运动事件:通过加速器进行触发(例如手机晃动) 远程控制事件:通过其他远程设备触发(例如耳机控制

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

-- iOS事件全面解析 转载来自崔江涛(KenshinCui) 链接:http://www.cnblogs.com/kenshincui/p/3950646.html 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事件(手势操作).运动事件.远程控制事件等展开学习: iOS事件简介 触摸事件 手势识别 运动事件 远程控制事件 iOS事件 在iOS中事件分为三类: 触摸事

iOS开发之触摸事件及手势

1.iOS中的事件 在用户使用app过程中,会产生各种各样的事件,iOS中的事件可以分为3大类型: 2.响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象”, UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. 2.UIResponder 继承了UIResponder就可以处理事件.UIResponder内部提供了以下

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

视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类.尽管后者在播放的稳定性和播放画面质量上可能没有前者 优秀,但网络流媒体影像视频的广泛传播性使之正被广泛应用于视频点播.网络演示.远程教育.网络视频广告等等互联网信息服务领域. AD:WOT2015 互联网运维与开发者大会 热销抢票 播放视频 视频文件介绍 视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类.尽管后者在播放的稳定性和播放画面质量上可能没有前者 优秀,但网络流媒

iOS开发之多媒体API

播放视频 视频文件介绍 视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类.尽管后者在播放的稳定性和播放画面质量上可能没有前者 优秀,但网络流媒体影像视频的广泛传播性使之正被广泛应用于视频点播.网络演示.远程教育.网络视频广告等等互联网信息服务领域. 适合移动设备的视频文件 3GP,3GP是一种3G流媒体的视频编码格式,主要是为了配合3G网络的高传输速度而开发的,也是目前手机中最为常见的一种视频格式. 视频MP4格式,除了支持MP3所具有的音乐播放功能外,还具

iOS开发之多媒体API(1)

本文转载至 http://mobile.51cto.com/iphone-423224.htm 视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类.尽管后者在播放的稳定性和播放画面质量上可能没有前者 优秀,但网络流媒体影像视频的广泛传播性使之正被广泛应用于视频点播.网络演示.远程教育.网络视频广告等等互联网信息服务领域. AD:2014WOT全球软件技术峰会北京站 课程视频发布 播放视频 视频文件介绍 视频格式可以分为适合本地播放的本地影像视频和适合在网络中播