1、事件(UIEvent),是由硬件设备捕捉到用户对设备的操作,把这个操作抽象成一个事件对象 ios中三大事件:触 Touches 摸晃动事件Motion,远程控制事件RemoteControl;其中应有最广泛的是触摸事件 UIView是支持触摸的,由于UIView 内部没有实现跟触摸相关的方法,所以我们再点击UIView创建其子类进行方法实现 2、一般准备做题思路:先在 AppDelegate.m中建立一个 TouchVC对象 TouchViewController *touchVC = [[TouchViewController alloc]init]; //将touchVC指定self.window的为根视图控制器 self.window.rootViewController = touchVC; 然后在 TouchViewController.m中设置颜色 self.view.backgroundColor = [UIColor yellowColor]; ———————————————————————————— MoveView *moveView = [[MoveView alloc]initWithFrame:CGRectMake(110, 234, 100, 100)]; moveView.backgroundColor = [UIColor blackColor]; [self.view addSubview:moveView]; PinchView *pinchView = [[PinchView alloc]initWithFrame:CGRectMake(60, 184, 200, 200)]; pinchView.backgroundColor = [UIColor orangeColor]; [self.view addSubview:pinchView]; ———————————————————————————— //如果想让一个视图对象对触摸事件作出反应,需要在这个类中的.m文件中实现跟触摸相关一些方法 //当手指在视图范围内移动的时候触发 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ // self.backgroundColor = [UIColor randomColor]; self.center = CGPointMake(arc4random_uniform(220 - 100 + 1) + 100, arc4random_uniform(468 - 100 +1) +100); //取出手指对像 UITouch *f = [touches anyObject]; //当前手指的 位置 CGPoint location = [f locationInView:self]; //之前手指位置 CGPoint previousLocation = [f previousLocationInView:self]; CGPoint center = self.center; CGFloat dx = location.x - previousLocation.x; CGFloat dy = location.y - previousLocation.y; self.center = CGPointMake(center.x + dx, center.y + dy); NSLog(@"%s",__FUNCTION__); - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { //1.获取手指对象 UITouch *finger = [touches anyObject]; CGPoint currentLocation = [finger locationInView:self]; CGPoint previousLocation = [finger previousLocationInView:self]; //4.计算手指在x轴和y轴上的增量 //手指在x轴上的增量 CGFloat dx = currentLocation.x - previousLocation.x; //手指在y轴上的增量 CGFloat dy = currentLocation.y - previousLocation.y; //获取中心点,之前center的位置 CGPoint center = self.center; self.center = CGPointMake(center.x + dx, center.y + dy); } ——————————————————————————————————————————
-(instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { //ios支持多点触摸,只是默认是单点触摸 self.multipleTouchEnabled = YES; } return self; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ //如果集合中touch集合中手指对象个数为1,就直接返回touchsMoved方法 if (1 == touches.count) { return;//结束方法 }else{ //得到集合中所有手指对象,并使用数组存储(数组有序) NSArray *allTouchs = [touches allObjects]; UITouch *touch1 = [allTouchs firstObject]; UITouch *touch2 = [allTouchs lastObject]; //求出两个手指对象当前的位置 CGPoint firstTouch1 = [touch1 locationInView:self]; CGPoint secondTouch2 = [touch2 locationInView: self]; //求出当前两个手指的间距 CGFloat currentDistance = [self distanceFromeFirstPoint:firstTouch1 secondPoint:secondTouch2]; //求出之前两个手指的位置 CGPoint previousFirstPoint = [touch1 previousLocationInView:self]; CGPoint previousSecondPoint = [touch2 previousLocationInView:self]; //求出之前两个点的距离 CGFloat previousDistance = [self distanceFromeFirstPoint:previousFirstPoint secondPoint:previousSecondPoint]; //获取捏合前后两个手指间距的比例 CGFloat rate = currentDistance / previousDistance; //缩放视图,如果视图的大小发生变化时,而中心点的位置不发生变化,修改bounds就可以了 self.bounds = CGRectMake(0, 0, self.bounds.size.width * rate, self.bounds.size.height * rate); } }//封装一个计算距离的方法(sqrt求开方) - (CGFloat)distanceFromeFirstPoint : (CGPoint)firstPoint secondPoint : (CGPoint)secondPoint{ CGFloat dx = firstPoint.x - secondPoint.x; CGFloat dy = firstPoint.y - secondPoint.y; //当前两点距离 return sqrt(dx * dx + dy * dy); ================================================================================
ResponderViewController *responderVC = [[ResponderViewController alloc]init]; //将responderVC指定为根控制器 self . window . rootViewController = responderVC; ResponderViewController.m 1、 UIResponder 响应者类,继承自NSObject,它是一个响应者的基类,它提供了一些处理事件的方法 //什么是响应者(响应者对象):1.继承自UIResponder 2.能对ios事件中(触摸事件,晃动事件,远程事件)做出响应的对象就叫做响应者 // UILabel ,UIImageView 默认用户交互是关闭的 响应者链:确定事件作用的对象时,UIAppcation --->UIAppcationDelegate--->window--->视图控制器--->视图控制器上的子视图 响应事件:(有大到小)视图控制器上的子视图--->视图控制器--->window--->UIAppcationDelegate---UIAppcation 如果都不处理这个事件,事件就会被丢弃 ResponderView *redView = [[ResponderView alloc]initWithFrame:[UIScreenmainScreen].bounds]; redView.tag = 101; redView.userInteractionEnabled = NO; redView.backgroundColor = [UIColor redColor]; [self.view addSubview:redView]; [redView release]; ResponderView *yellowView = [[ResponderView alloc]initWithFrame:CGRectMake(30, 360, 320, 284)]; yellowView.tag = 102; //关闭用户的交互造成响应者链就到这个位置断开了,事件只能找他的上一级处理,如果上一级都不处理,此事件就不了了之了 yellowView.userInteractionEnabled = YES; yellowView.backgroundColor = [UIColor yellowColor]; [redView addSubview:yellowView]; [yellowView release]; ResponderView *greenView = [[ResponderView alloc]initWithFrame:CGRectMake(20, 20, 280, 244)]; greenView.tag = 103; greenView.backgroundColor = [UIColor greenColor]; [yellowView addSubview:greenView]; [greenView release]; ResponderView *blueView = [[ResponderView alloc]initWithFrame:CGRectMake(20, 20, 240, 204)]; blueView.tag = 104; blueView.backgroundColor = [UIColor blueColor]; [greenView addSubview:blueView]; - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ switch (self.tag) { case 101: NSLog(@"红色视图"); break; case 102: NSLog(@"黄色视图"); break; case 103: NSLog(@"绿色视图"); break; case 104: NSLog(@"蓝色视图"); break; default: break; ==============================================