iOS中,提供了事件处理:触摸事件,运动事件,远程控制事件.这很大得方便程序猿的工作.
这里先简单做个介绍:
1 // 2 // ViewController.m 3 // demo 4 // 5 // Created by shaoting on 15/11/23. 6 // Copyright © 2015年 9elephas. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController () 12 13 @end 14 15 @implementation ViewController 16 /** 17 * IOS事件分类:1,触摸事件2,运动事件3,远程控制事件 18 1.触摸事件:触碰屏幕 19 2.运动事件:通过加速器触发(如晃动手机) 20 3.远程控制事件:通过其他设备远程控制(如蓝牙) 21 在iOS中,只有继承自UIResponder类的对象才能触发事件 22 */ 23 - (void)viewDidLoad { 24 [super viewDidLoad]; 25 self.title = @"iOS事件"; 26 self.view.backgroundColor = [UIColor whiteColor]; 27 //开个图 28 UIImage * image = [UIImage imageNamed:@"屏幕快照 2015-11-23 17.37.19"]; 29 self.imageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 20, 150, 300)]; 30 self.imageView.image = image; 31 [self.view setBackgroundColor:[UIColor colorWithPatternImage:image]]; //view的背景色使用image 32 [self.view addSubview:_imageView]; 33 } 34 //触摸事件 35 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 36 NSLog(@"一根手指或多根手指触摸时触发"); 37 UITouch * touch = [touches anyObject]; //获得任意触摸对象 38 NSLog(@"触摸对象%@",touch); 39 CGPoint current = [touch locationInView:self.view];//获得当前的触摸对象 40 NSLog(@"当前的触摸对象%@",NSStringFromCGPoint(current)); //把CGPoint对象转换为字符串对象 41 } 42 -(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 43 NSLog(@"一根或者多根手指离开屏幕时触发"); 44 } 45 //以图片随鼠标移动为例 46 -(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 47 NSLog(@"一根或者多根手指移动时触发"); 48 UITouch * touch = [touches anyObject]; 49 CGPoint current = [touch locationInView:self.view];//当前位置 50 CGPoint previous = [touch previousLocationInView:self.view];//当前位置的前一个位置 51 CGPoint center = _imageView.center;//移动前的中心位置 52 CGPoint offset = CGPointMake(current.x - previous.x, current.y - previous.y); 53 _imageView.center = CGPointMake(center.x+offset.x, center.y+offset.y); 54 NSUInteger count = touch.tapCount;//短时间内点击的次数 55 NSLog(@"短时间内点击的次数%ld",count); 56 UITouchPhase phase = touch.phase;//触摸周期内的各个状态 57 NSLog(@"触摸周期内的各个状态%ld",phase); 58 NSTimeInterval tamp = touch.timestamp;//触摸产生或者变化的时间戳 59 NSLog(@"触摸产生或者变化的时间戳%f",tamp); 60 UIView * view = touch.view; //触摸时所在的视图 61 NSLog(@"触摸时所在的视图%@",view); 62 UIWindow * window = touch.window;//触摸时所在的window 63 NSLog(@"触摸时所在的window%@",window); 64 } 65 //运动事件 66 -(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{ 67 NSLog(@"运动开始时触发"); 68 } 69 -(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{ 70 NSLog(@"运动结束时触发"); 71 } 72 -(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event{ 73 NSLog(@"运动被意外取消时触发"); 74 } 75 //远程控制事件 76 -(void)remoteControlReceivedWithEvent:(UIEvent *)event{ 77 NSLog(@"接收到远程控制消息时执行"); 78 } 79 80 - (void)didReceiveMemoryWarning { 81 [super didReceiveMemoryWarning]; 82 // Dispose of any resources that can be recreated. 83 } 84 85 @end
其中,模拟器开启晃动手机的功能键是:
触摸事件:
1 // 2 // ViewController.m 3 // demo1 4 // 5 // Created by shaoting on 15/11/23. 6 // Copyright © 2015年 9elephas. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #define Hight [UIScreen mainScreen].bounds.size.height-49 11 #define Width [UIScreen mainScreen].bounds.size.width 12 13 @interface ViewController ()<UIGestureRecognizerDelegate>{ 14 int _count; 15 } 16 @end 17 18 @implementation ViewController 19 /** 20 * 复杂手势:6种 21 点按手势:UITapGestureRecognizer 22 捏合手势:UIPinchGestureRecognizer 23 拖动手势:UIPanGetureRecognizer 24 清扫手势:UISwipeGetureRecognizer 25 旋转手势:UIRotationGetureReconizer 26 长按手势:UILongPressGetureReconizer 27 6种手势中点按手势属于离散型手势(不用判断状态),其余手势属于连续手势(除清扫手势外均需要判断状态). 28 29 各手势的触发时机:点按事件:点击屏幕然后松开时触发 30 长按事件:长时间点击屏幕不松开即会触发(不加长按&拖动冲突解决),长时间点击屏幕松开即会触发(加长按&拖动手势冲突解决ß) 31 拖动事件:手指在屏幕上拖动时触发 32 旋转手势:手指在屏幕上旋转时触发 33 清扫手势:只在清扫完毕(手指清扫屏幕离开屏幕时)才会触发 34 捏合手势:手指捏合时触发 35 36 事件冲突:点击手势会和旋转手势会发生冲突. 37 清扫手势会和拖动手势会发生冲突. 38 39 40 */ 41 - (void)viewDidLoad { 42 [super viewDidLoad]; 43 [self initLayout]; 44 [self addGesture]; 45 46 47 // Do any additional setup after loading the view, typically from a nib. 48 } 49 //布局 50 -(void)initLayout{ 51 _imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 49, Width, Hight)]; 52 _imageView.userInteractionEnabled = YES; //必须设置为YES,否则无法就收手势操作 53 UIImage * image = [UIImage imageNamed:@"0"]; 54 _imageView.image = image; 55 self.title = @"0"; 56 [self.view addSubview:_imageView]; 57 } 58 //添加手势 59 -(void)addGesture{ 60 UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)]; 61 tap.numberOfTapsRequired = 1; //设置点击次数,默认为1 62 tap.numberOfTouchesRequired = 1;//设置为手指数 63 [self.view addGestureRecognizer:tap];//添加手势进视图控制器上的视图 64 65 UIPinchGestureRecognizer * pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinch:)]; 66 [self.view addGestureRecognizer:pinch]; 67 68 UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)]; 69 [self.view addGestureRecognizer:pan]; 70 71 UISwipeGestureRecognizer * left = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipe:)]; 72 left.direction = UISwipeGestureRecognizerDirectionLeft; 73 [self.view addGestureRecognizer:left]; 74 UISwipeGestureRecognizer * right = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipe:)]; 75 right.direction = UISwipeGestureRecognizerDirectionRight; 76 [self.view addGestureRecognizer:right]; 77 78 UIRotationGestureRecognizer * rotation = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotation:)]; 79 [self.view addGestureRecognizer:rotation]; 80 81 UILongPressGestureRecognizer * longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)]; 82 [self.view addGestureRecognizer:longPress]; 83 84 85 //手势冲突解决 86 [pan requireGestureRecognizerToFail:left]; 87 [pan requireGestureRecognizerToFail:right];//解决拖动手势和清扫手势的冲突 88 [longPress requireGestureRecognizerToFail:pan];//解决长按手势和拖动手势的冲突 89 90 91 //多种手势在不同视图上的同时执行 92 //iOS默认只会触发一次,因为触发是沿着响应者链依次匹配,只要匹配到响应就会停止.可以修改- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer的返回值,默认返回NO 93 //上面演示了添加长按手势进视图控制器视图上,下面再添加长按手势到_imageView上,让这两个手势可以同时在不同视图上执行. 94 UILongPressGestureRecognizer * longpress1 = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress1:)]; 95 longpress1.delegate = self; 96 [_imageView addGestureRecognizer:longpress1]; 97 98 } 99 //点按事件 100 //点按是否显示状态栏 101 -(void)tap:(UITapGestureRecognizer *)tap{ 102 BOOL recognizer = !self.navigationController.navigationBarHidden; 103 [self.navigationController setNavigationBarHidden:recognizer]; 104 } 105 //捏合事件 106 //缩放图片 107 -(void)pinch:(UIPinchGestureRecognizer *)pinch{ 108 // NSLog(@"%ld",(long)pinch.state); // 捏合状态 109 //状态:0--未开始 1--手势开始 2--手势进行 3--手势完成 110 // typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { 111 // UIGestureRecognizerStatePossible, // 尚未识别是何种手势操作(但可能已经触发了触摸事件),默认状态 112 // 113 // UIGestureRecognizerStateBegan, // 手势已经开始,此时已经被识别,但是这个过程中可能发生变化,手势操作尚未完成 114 // UIGestureRecognizerStateChanged, // 手势状态发生转变 115 // UIGestureRecognizerStateEnded, // 手势识别操作完成(此时已经松开手指) 116 // UIGestureRecognizerStateCancelled, // 手势被取消,恢复到默认状态 117 // 118 // UIGestureRecognizerStateFailed, // 手势识别失败,恢复到默认状态 119 // 120 // UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手势识别完成,同UIGestureRecognizerStateEnded 121 // }; 122 if (pinch.state == UIGestureRecognizerStateChanged) { 123 _imageView.transform = CGAffineTransformMakeScale(pinch.scale, pinch.scale); //.scele记录缩放属性 124 }else if(pinch.state == UIGestureRecognizerStateEnded){ //缩放完毕后恢复 125 [UIView animateWithDuration:5 animations:^{ 126 _imageView.transform = CGAffineTransformIdentity;//取消形变 127 }]; 128 } 129 } 130 //拖动手势 131 -(void)pan:(UIPanGestureRecognizer *)pan{ 132 133 if (pan.state == UIGestureRecognizerStateChanged) { 134 CGPoint transform = [pan translationInView:self.view];//利用translationInView:取得在相对视图中的移动 135 _imageView.transform = CGAffineTransformMakeTranslation(transform.x, transform.y); 136 }else if(pan.state == UIGestureRecognizerStateEnded){ 137 [UIView animateWithDuration:2 animations:^{ 138 _imageView.transform = CGAffineTransformIdentity; 139 }]; 140 } 141 } 142 143 //清扫手势 144 -(void)swipe:(UISwipeGestureRecognizer *)swipe{ 145 //因为清扫手势虽然是连续手势,但是只有在清扫完毕时才会触发,所以不用判断状态 146 if (swipe.direction == UISwipeGestureRecognizerDirectionRight) { 147 [self nextImage]; 148 } 149 if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) { 150 [self lastImage]; 151 } 152 } 153 -(void)nextImage{ 154 int index=(_count+2+1)%2; 155 NSString *imageName=[NSString stringWithFormat:@"%i",index]; 156 _imageView.image=[UIImage imageNamed:imageName]; 157 _count=index; 158 [self showName]; 159 } 160 -(void)lastImage{ 161 int index=(_count+2-1)%2; 162 NSString *imageName=[NSString stringWithFormat:@"%i",index]; 163 _imageView.image=[UIImage imageNamed:imageName]; 164 _count=index; 165 [self showName]; 166 167 } 168 -(void)showName{ 169 NSString * name = [NSString stringWithFormat:@"%i",_count]; 170 self.title = name; 171 } 172 //旋转事件 173 //旋转使图片旋转 174 -(void)rotation:(UIRotationGestureRecognizer *)rotation{ 175 if (rotation.state == UIGestureRecognizerStateChanged) { 176 _imageView.transform = CGAffineTransformMakeRotation(rotation.rotation);// .rotation记录了改变的弧度 177 }else if(rotation.state == UIGestureRecognizerStateEnded){ 178 [UIView animateWithDuration:2 animations:^{ 179 _imageView.transform = CGAffineTransformIdentity; 180 }]; 181 } 182 } 183 //长按事件 184 -(void)longPress:(UILongPressGestureRecognizer *)longPress{ 185 //长按选择是否下载图片 186 if (longPress.state == UIGestureRecognizerStateBegan) { 187 UIAlertController * alterC = [UIAlertController alertControllerWithTitle:@"提示" message:@"是否下载该图片" preferredStyle:UIAlertControllerStyleActionSheet]; 188 UIAlertAction * cance = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]; 189 UIAlertAction * down = [UIAlertAction actionWithTitle:@"下载" style:UIAlertActionStyleDefault handler:nil]; 190 [alterC addAction:cance]; 191 [alterC addAction:down]; 192 [self presentViewController:alterC animated:YES completion:nil]; 193 194 } 195 } 196 -(void)longPress1:(UILongPressGestureRecognizer *)longpress{ 197 NSLog(@"添加手势进_imageView"); 198 } 199 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 200 if ([otherGestureRecognizer.view isKindOfClass:[self.view class]]) {//如果是控制器视图则继续沿着响应者链传播 201 return YES; 202 } 203 return NO; 204 } 205 206 - (void)didReceiveMemoryWarning { 207 [super didReceiveMemoryWarning]; 208 // Dispose of any resources that can be recreated. 209 } 210 211 @end
运动事件:
监听运动事件对于UI控件有个前提就是监听对象必须是第一响应者(对于UIViewController视图控制器和UIAPPlication没有此要求)。这也就意味着如果监听的是一个UI控件那么-(BOOL)canBecomeFirstResponder;方法必须返回YES。同时控件显示时(在-(void)viewWillAppear:(BOOL)animated;事件中)调用视图控制器的becomeFirstResponder方法。当视图不再显示时(在-(void)viewDidDisappear:(BOOL)animated;事件中)注销第一响应者身份。(是真的吗?)
1 // 2 // ViewController.m 3 // demo2 4 // 5 // Created by shaoting on 15/11/25. 6 // Copyright © 2015年 9elephas. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController (){ 12 UIImageView * _imageView; 13 } 14 15 @end 16 17 @implementation ViewController 18 19 - (void)viewDidLoad { 20 [super viewDidLoad]; 21 _imageView = [[UIImageView alloc]initWithFrame:[UIScreen mainScreen].bounds]; 22 _imageView.image = [UIImage imageNamed:@"1"]; 23 [self.view addSubview:_imageView]; 24 } 25 26 #pragma mark 运动开始 27 -(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event{ 28 NSLog(@"运动开始了"); 29 //这里只处理摇晃事件 30 if (motion==UIEventSubtypeMotionShake) { 31 _imageView.image=[self getImage]; 32 } 33 } 34 #pragma mark 运动结束 35 -(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{ 36 NSLog(@"运动结束了"); 37 } 38 -(UIImage *)getImage{ 39 int index= arc4random()%2; 40 NSString *imageName=[NSString stringWithFormat:@"%i",index]; 41 UIImage *image=[UIImage imageNamed:imageName]; 42 return image; 43 } 44 45 - (void)didReceiveMemoryWarning { 46 [super didReceiveMemoryWarning]; 47 // Dispose of any resources that can be recreated. 48 } 49 50 @end
远程控制事件:
这里有点问题,以后再写吧.