iOS - UITouch
前言
NS_CLASS_AVAILABLE_IOS(2_0) @interface UITouch : NSObject
@available(iOS 2.0, *) public class UITouch : NSObject
- 触摸事件基本都是发生在 viewController 中,首先触摸的对象是视图,而视图的类 UIView 继承了 UIRespnder 类,但是要对事件作出处理,还需要重写 UIResponder 类中定义的事件处理函数。根据不同的触摸状态,程序会调用相应的处理函数。
1、touch 的创建
在系统触摸事件处理方法中实现
Objective-C
// 获取任意一个触摸对象
UITouch *touch = [touches anyObject]; // 获取任意一个触摸对象
UITouch *touch = [[event allTouches] anyObject]; // 获取指定的 view 触摸对象
UITouch *touch = [[event touchesForView:myView] anyObject]; // 获取指定的 window 触摸对象
UITouch *touch = [[event touchesForWindow:self.view.window] anyObject];
Swift
// 获取任意一个触摸对象
let touch:UITouch = touches.first! as UITouch // 获取任意一个触摸对象
let touch2:UITouch = (event?.allTouches()?.first!)! as UITouch // 获取指定的 view 触摸对象
let touch3:UITouch = (event!.touchesForView(myView!)?.first)! as UITouch // 获取指定的 window 触摸对象
let touch4:UITouch = (event!.touchesForWindow(self.view.window!)?.first)! as UITouch
2、touch 的设置
在系统触摸事件处理方法中实现
Objective-C
// 设置接收多点触摸
/*
默认为 NO,即视图默认不接收多点触摸
*/
self.view.multipleTouchEnabled = YES;
Swift
// 设置接收多点触摸
/*
默认为 NO,即视图默认不接收多点触摸
*/
self.view.multipleTouchEnabled = true
3、touch 的获取
在系统触摸事件处理方法中实现
Objective-C
// 获取触摸窗口
UIWindow *touchWindow = touch.window; // 获取触摸视图
UIView *touchView = touch.view; // 获取触摸手势
NSArray *touchGesture = touch.gestureRecognizers; // 获取触摸次数
NSUInteger tapCount = touch.tapCount; // 获取触摸时间
NSTimeInterval timestamp = touch.timestamp; // 获取触摸状态
/*
UITouchPhaseBegan, // whenever a finger touches the surface. 触摸开始
UITouchPhaseMoved, // whenever a finger moves on the surface. 接触点移动
UITouchPhaseStationary, // whenever a finger is touching the surface but hasn't moved
// since the previous event. 接触点无移动
UITouchPhaseEnded, // whenever a finger leaves the surface. 触摸结束
UITouchPhaseCancelled, // whenever a touch doesn't end but we need to stop tracking
// (e.g. putting device to face) 触摸取消
*/
UITouchPhase touchPhase = touch.phase; // 获取触摸位置 // 上次触摸点的位置
CGPoint lastPoint = [touch previousLocationInView:self.view]; // 当前触摸点的位置
CGPoint currentPoint = [touch locationInView:self.view]; // 获取触摸半径
CGFloat majorRadius = touch.majorRadius;
CGFloat majorRadiusTolerance = touch.majorRadiusTolerance;
Swift
// 获取触摸窗口
let touchWindow:UIWindow = touch.window! // 获取触摸视图
let touchView:UIView = touch.view! // 获取触摸手势
let touchGesture:[AnyObject] = touch.gestureRecognizers! // 获取触摸次数
let tapCount:Int = touch.tapCount // 获取触摸时间
let timestamp:NSTimeInterval = touch.timestamp // 获取触摸状态
/*
case Began, // whenever a finger touches the surface. 触摸开始
case Moved, // whenever a finger moves on the surface. 接触点移动
case Stationary, // whenever a finger is touching the surface but hasn't moved since
// the previous event. 接触点无移动
case Ended, // whenever a finger leaves the surface. 触摸结束
case Cancelled, // whenever a touch doesn't end but we need to stop tracking
// (e.g. putting device to face) 触摸取消
*/
let touchPhase:UITouchPhase = touch.phase // 获取触摸位置 // 上次触摸点的位置
let lastPoint:CGPoint = touch.previousLocationInView(self.view) // 当前触摸点的位置
let currentPoint:CGPoint = touch.locationInView(self.view) // 获取触摸半径
let majorRadius:CGFloat = touch.majorRadius
let majorRadiusTolerance:CGFloat = touch.majorRadiusTolerance
4、系统触摸事件处理方法
不用手动调用
Objective-C
// 触摸开始,重写 UIResponder 中定义的方法
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { } // 触摸移动,重写 UIResponder 中定义的方法
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { } // 触摸结束,重写 UIResponder 中定义的方法
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { } // 触摸取消,重写 UIResponder 中定义的方法
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { }
Swift
// 触摸开始,重写 UIResponder 中定义的方法
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { } // 触摸移动,重写 UIResponder 中定义的方法
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { } // 触摸结束,重写 UIResponder 中定义的方法
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { } // 触摸取消,重写 UIResponder 中定义的方法
override func touchesCancelled(touches: Set<UITouch>!, withEvent event: UIEvent!) { }
5、视图随触摸移动
Objective-C
// 触摸移动
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { // 获取触摸对象
UITouch *touch = [touches anyObject];
UIView *tapView = touch.view; // 获取触摸点位置
CGPoint lastPoint = [touch previousLocationInView:self.view];
CGPoint currentPoint = [touch locationInView:self.view]; // 改变视图中心坐标
CGPoint tapViewCenter = tapView.center; tapViewCenter.x += currentPoint.x - lastPoint.x;
tapViewCenter.y += currentPoint.y - lastPoint.y; tapView.center = tapViewCenter;
}
Swift
// 触摸移动
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { // 获取触摸对象
let touch:UITouch = touches.first! as UITouch
let tapView = touch.view // 获取触摸点位置
let lastPoint:CGPoint = touch.previousLocationInView(self.view)
let currentPoint:CGPoint = touch.locationInView(self.view) // 改变视图中心坐标
var tapViewCenter = tapView!.center tapViewCenter.x += currentPoint.x - lastPoint.x
tapViewCenter.y += currentPoint.y - lastPoint.y tapView!.center = tapViewCenter
}
6、单击/双击触摸
Objective-C
// 触摸结束
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; // 单击
if (touch.tapCount == 1) { // 响应单击触摸事件
[self performSelector:@selector(singleTapClick) withObject:nil afterDelay:0];
}
// 双击
else if (touch.tapCount == 2) { // 取消单击触摸响应事件
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTapClick) object:nil]; // 响应双击触摸事件
[self performSelector:@selector(doubleTapClick) withObject:nil afterDelay:0];
}
} // 单击触摸响应事件处理
- (void)singleTapClick { self.view.backgroundColor = [UIColor greenColor];
} // 双击触摸响应事件处理
- (void)doubleTapClick { self.view.backgroundColor = [UIColor orangeColor];
}
Swift
// 触摸结束
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { let touch = touches.first! as UITouch // 单击
if touch.tapCount == 1 { // 响应单击触摸事件
self.performSelector(#selector(singleTapClick), withObject: nil, afterDelay: 0)
} // 双击
if touch.tapCount == 2 { // 取消单击触摸响应事件
NSObject.cancelPreviousPerformRequestsWithTarget(self, selector: #selector(singleTapClick), object: nil) // 响应双击触摸事件
self.performSelector(#selector(doubleTapClick), withObject: nil, afterDelay: 0)
}
} // 单击触摸响应事件处理
func singleTapClick() { self.view.backgroundColor = UIColor.greenColor()
} // 双击触摸响应事件处理
func doubleTapClick() { self.view.backgroundColor = UIColor.orangeColor()
}
iOS - UITouch的更多相关文章
- iOS开发——UI进阶篇(十二)事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别
触摸事件 在用户使用app过程中,会产生各种各样的事件 一.iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponde ...
- iOS中文API之UITouch详解
UITouch 对象用于位置. 大小. 运动和一根手指在屏幕上为某一特定事件的力度.触摸的力度是从开始在 iOS 9 支持 3D 的触摸的设备上可用.你可以通过UIEvent对象传递给响应者对象访问. ...
- iOS:触摸控件UITouch、事件类UIEvent
UITouch:触摸控件类 UIEvent:事件类 ❤️❤️❤️UITouch的介绍❤️❤️❤️ 一.触摸状态类型枚举 typedef NS_ENUM(NSInteger, UITouchPhas ...
- iOS开发UITouch触摸API简介
1.UITouch简介 当用户触摸屏幕时,会创建一个UITouch对象: UITouch的作用保存着触摸相关的信息,比如触摸的位置.时间.阶段等: 当从开始到结束,系统会更新UITouch对象,结束时 ...
- iOS总结_UI层自我复习总结
UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...
- iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
- iOS开发中静态库制作 之.a静态库制作及使用篇
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
- iOS中数据库应用基础
iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...
- iOS手势解锁、指纹解锁--Swift代码
一.手势密码 1. 1.1.用UIButton组成手势的节点. 1.2.当手指接触屏幕时,调用重写的 touchesBegan:withEvent方法(在touchesBegan里调用setNeeds ...
随机推荐
- JavaEE基础(十五)/集合
1.集合框架(对象数组的概述和使用) A:案例演示 需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息. Student[] arr = new Student ...
- 使用 Bootstrap Typeahead 组件
Bootstrap 中的 Typeahead 组件就是通常所说的自动完成 AutoComplete,功能很强大,但是,使用上并不太方便.这里我们将介绍一下这个组件的使用. 第一,简单使用 首先,最简单 ...
- java 字符串处理
第一张: 第二张:
- Eclipse中Outline里各种图标的含义
在使用Eclipse或者MyEclipse开发的时候,你一定看到过Outline和Package Explorer中小图标,很多刚刚接触编程的童鞋们可能不会在意它们代表的含义,但如果你花几分钟的时间了 ...
- Java8新特性之一、时间日期API
package com.effective.common.base.date; import java.time.Instant; import java.time.LocalDate; import ...
- poj1961 Period
我们考虑KMP算法中fail失配指针的意义. 对于一个模式串(Pattern),位置i对应的失配指针fail[i]是那个位置: 这个位置满足的条件是,子串[0, fail[i])是位置i(不含)的后缀 ...
- 某些输入文件使用或覆盖了已过时的 API
android出现注: 某些输入文件使用或覆盖了已过时的 API. 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译. 注: 某些输入文件使用了未经检查或不安全的操作. 注 ...
- Android:onNewIntent()触发机制及注意事项
一.onNewIntent() 在IntentActivity中重写下列方法:onCreate onStart onRestart onResume onPause onStop onDestro ...
- 转 Android学习笔记: 学习过程中碰到的一些问题及解决方法
在学习Android开发的过程中遇到了不少的问题,所幸的是最终经过上网查询都得到了解决.现在将我在学习Android开发过程中遇到的一些问题及解决的方法整理如下. 1.R.java不能实时更新 问题描 ...
- asp.net MVC4 lognet4 日志
asp.net MVC4 lognet4 日志 步骤: 1.引入log4net.dll 2.写配置文件 web.config 加入 如下代码 在<configSections> 中加入&l ...