UITouch:触摸控件类 UIEvent:事件类
??????UITouch的介绍??????
一、触摸状态类型枚举
typedef NS_ENUM(NSInteger, UITouchPhase) {
UITouchPhaseBegan, // 开始触摸
UITouchPhaseMoved, // 触摸移动
UITouchPhaseStationary, // 触摸没有移动
UITouchPhaseEnded, //触摸结束
UITouchPhaseCancelled, //取消触摸
};
@interface UITouch : NSObject
二、属性:
//时间戳记录了触摸事件产生或变化时的时间,单位是秒
@property(nonatomic,readonly) NSTimeInterval timestamp;
//当前触摸事件在一个周期中所处的状态
@property(nonatomic,readonly) UITouchPhase phase;
//表示短时间内点按屏幕的次数
@property(nonatomic,readonly) NSUInteger tapCount;
//触摸的主半径
@property(nonatomic,readonly) CGFloat majorRadius;
//触摸的主半径的公差
@property(nonatomic,readonly) CGFloat majorRadiusTolerance;
//触摸产生时所处的窗口。由于窗口可能发生变化,当前所在的窗口不一定是最开始的窗口
@property(nonatomic,readonly,retain) UIWindow *window;
//触摸产生时所处的视图。由于视图可能发生变化,当前视图也不一定时最初的视图
@property(nonatomic,readonly,retain) UIView *view;
//触摸手势数组
@property(nonatomic,readonly,copy) NSArray *gestureRecognizers;
三、方法:
//返回当前触摸点的位置
- (CGPoint)locationInView:(UIView *)view;
//返回上一个触摸点的位置
- (CGPoint)previousLocationInView:(UIView *)view;
@end
四、由于触摸点被放在了NSSet,所以通过NSSet集合的一个属性和方法可以获取触摸点:
//获取全部的触摸点
@property (readonly, copy) NSArray *allObjects;
//获取当前触摸点
- (id)anyObject;
===============================================================
??????UIEvent的介绍??????
//输入事件类型枚举
typedef NS_ENUM(NSInteger, UIEventType) {
UIEventTypeTouches, //触摸事件
UIEventTypeMotion, //运动事件
UIEventTypeRemoteControl, //远程控制事件
};
//输入事件不同类型的一些具体事件枚举
typedef NS_ENUM(NSInteger, UIEventSubtype) {
UIEventSubtypeNone = 0,
UIEventSubtypeMotionShake = 1
UIEventSubtypeRemoteControlPlay = 100,
UIEventSubtypeRemoteControlPause = 101,
UIEventSubtypeRemoteControlStop = 102,
UIEventSubtypeRemoteControlTogglePlayPause = 103,
UIEventSubtypeRemoteControlNextTrack = 104,
UIEventSubtypeRemoteControlPreviousTrack = 105,
UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
UIEventSubtypeRemoteControlEndSeekingBackward = 107,
UIEventSubtypeRemoteControlBeginSeekingForward = 108,
UIEventSubtypeRemoteControlEndSeekingForward = 109;
};
//类
@interface UIEvent : NSObject
//属性
@property(nonatomic,readonly) UIEventType type ; //事件类型
@property(nonatomic,readonly) UIEventSubtype subtype ; //同一事件类型的具体事件
@property(nonatomic,readonly) NSTimeInterval timestamp; //事件触发时间间隔
//方法
※所有触摸点
- (NSSet *)allTouches;
※窗体上的触摸点
- (NSSet *)touchesForWindow:(UIWindow *)window;
※视图上的触摸点
- (NSSet *)touchesForView:(UIView *)view;
※手势触摸点
- (NSSet *)touchesForGestureRecognizer:(UIGestureRecognizer *)gesture;
@end
五、举例如下:演示触摸事件(都是用鼠标代替手指在模拟器上进行测试)
实例一:打印触摸输出
1.设置用户交互和触摸点
//支持用户交互,能够处理触摸事件 self.view.userInteractionEnabled = YES; //支持多点触摸 self.view.multipleTouchEnabled = YES;
2.实现UIResponser中触摸的4个事件
触摸开始
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"触摸开始"); //取出一个touch对象 UITouch *touch = [touches anyObject]; //取出当前点 CGPoint location = [touch locationInView:self.view]; //取出上一点 CGPoint previousLocation = [touch previousLocationInView:self.view]; NSLog(@"%@,%@",NSStringFromCGPoint(location),NSStringFromCGPoint(previousLocation)); //遍历每一个touch对象 [touches enumerateObjectsUsingBlock:^(UITouch *touch, BOOL *stop) { }]; }
触摸移动
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"触摸移动"); }
触摸结束
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"触摸结束"); }
触摸取消(该事件在模拟器不好演示)
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"触摸取消"); }
演示结果如下:
1.在屏幕上开始触摸和结束触摸时:
2015-10-08 21:21:24.875 02-touch[5988:346647] 触摸开始 2015-10-08 21:21:24.875 02-touch[5988:346647] {219.5, 181},{219.5, 181} 2015-10-08 21:21:24.983 02-touch[5988:346647] 触摸结束
2.在屏幕上触摸移动时:
2015-10-08 21:23:00.388 02-touch[5988:346647] 触摸移动 2015-10-08 21:23:00.413 02-touch[5988:346647] 触摸移动 2015-10-08 21:23:00.430 02-touch[5988:346647] 触摸移动
实例二:触摸时,视图变色(每触摸一次,颜色就交替改变)
<1>布局故事板,在视图中在拖一个试图UIView控件,设置合适大小和背景颜色
<2>自定义一个试图类,将控件与该类关联
<3>在自定义类myView.m中实现触摸开始事件
//开始触摸 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if ([self.backgroundColor isEqual:[UIColor redColor]]) { self.backgroundColor = [UIColor purpleColor]; } else { self.backgroundColor = [UIColor redColor]; } }
<4>演示结果如下
开始颜色:红色 触摸一次:变为紫色 再触摸一次:又变为红色
实例三:触摸移动时,移动红色试图位置
<1>布局故事板,在视图中在拖一个试图UIView控件,设置合适大小和背景颜色
<2>自定义一个试图类,将控件与该类关联,同时将视图IBOutLet到视图控制器类中
<3> 在控制器类ViewController.m中实现触摸移动事件
//添加移动事件 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { //获取触摸对象touch UITouch *touch = [touches anyObject]; //当前触摸点 CGPoint location = [touch locationInView:self.view]; //设置触摸点只有在myView中,才可以移动myView视图 CGPoint point = [touch locationInView:self.myView]; if ([self.myView pointInside:point withEvent:event]) { //上一个触摸点 CGPoint previousLocation = [touch previousLocationInView:self.view]; //计算位移 CGFloat xOffset = location.x - previousLocation.x; CGFloat yOffset = location.y - previousLocation.y; //设置视图新的位置 CGPoint center = self.myView.center; self.myView.center = CGPointMake(center.x+xOffset, center.y+yOffset); } }
<4>演示结果如下:触摸红色视图位置拖拽移动即可