2.0 触摸事件
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末
如果觉得本文内容过长,请前往本人 “简书”
UIView不接收触摸事件的三种情况:
1、不接收用户交互
userInteractionEnabled = NO
|
2、隐藏
hidden = YES
|
3、透明
alpha = 0.0 ~ 0.01
|
4. 如果子视图的位置超出了父视图的有效范围, 那么子视图也是无法与用户交互的, 即使设置了父视图的 clipsToBounds = NO, 可以看到, 但是也是无法与用户交互的
提示:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的
|
触摸事件中的方法:
1 // 手指按下的时候调用 2 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; 3 4 // 手指移动的时候调用 5 - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event; 6 7 // 手指抬起的时候调用 8 - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event; 9 10 // 取消(非正常离开屏幕,意外中断事件) 11 - (void)touchesCancelled:(nullableNSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event;
1 // 3D Touch相关方法,当前触摸对象触摸时力量改变所触发的事件,返回值是UITouchPropertyie 2 - (void)touchesEstimatedPropertiesUpdated:(NSSet * _Nonnull)touches NS_AVAILABLE_IOS(9_1);
相关代码:
1 #import “TDView.h" 2 3 @implementation TDView 4 5 // 手指触摸到这个view的时候调用 6 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 7 8 UITouch *t = touches.anyObject; 9 10 NSLog(@"%ld", t.tapCount); // 点击这个响应者对象的次数 11 12 NSLog(@"%@", t.window); // 点击这个响应者对象所在的window 13 NSLog(@"%@", self.window); 14 NSLog(@"%@", [UIApplication sharedApplication].keyWindow); 15 16 NSLog(@"%s", __func__); 17 } 18 19 // 手指在这个view上移动的时候调用 20 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 21 // 获取触摸对象 22 UITouch *t = touches.anyObject; 23 24 // 获取上一个点的位置 25 CGPoint lastP = [t previousLocationInView:self.superview]; 26 NSLog(@"%@----上一个点的位置", NSStringFromCGPoint(lastP)); 27 28 // 获取当前点的位置 29 CGPoint p = [t locationInView:self.superview]; 30 NSLog(@"%@----当前点的位置", NSStringFromCGPoint(p)); 31 } 32 33 // 手指离开这个view的时候调用 34 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 35 NSLog(@"%s", __func__); 36 } 37 38 // 取消(非正常离开屏幕) 39 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 40 NSLog(@"%s", __func__); 41 } 42 43 @end
补充:关于NSSet和 NSArray
|
如何访问
|
如何取值
|
如何遍历
|
效率
|
应用场景
|
NSSet
集合
|
无序访问,不重复的。
存放到 NSSet 中的内容并不会排序与添加顺序也没有关系
|
取集合里面任意一个元素 anyObject
通过 anyObject 来访问单个元素
|
for in | 效率高 |
(1)比如重用 Cell 的时候, 从缓存池中随便获取一个就可以了, 无需按照指定顺序来获取
(2)当需要把数据存放到一个集合中, 然后判断集合中是否有某个对象的时候
|
NSArray
数组
|
有序访问,可以有重复对象。
对象的顺序是按照添加的顺序来保存的
|
通过下标来访问
|
for
forin
|
当需要把数据存放到一个集合中, 然后判断集合中是否有某个对象的时候
|