【iOS】手势识别
2016-02-22 19:57
405 查看
iOS 手势
1.如果一个控件继承于 UIControl,那么它将不需要手势 2.所有控件都可以添加手势 [控件 addGestureRecognizer: ] 3.iOS 系统提供的手势有哪些 UITapGestureRecognizer 点击 UISwipeGestureRecognizer 轻扫 UIPanGestureRecognizer 拖动 UIRotationGestureRecognizer 旋转 UIPinchGestureRecognizer 捏合 UILongPressGestureRecognizer 长按 4.iOS 自定义的手势都是具有相同的父类 UIGestureRecognizer 5.UIGestureRecognizer 这个手势父类是如何封装? UIGestureRecognizer 这个父类可以看做一个抽象类,并不具备手势的具体功能,但是它提供了子类共有的初始化方法、属性、代理 <共有的初始化方法> - (instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action <2>手势的状态 state <3>手势是否有效 enable <4>代理 delegate <5>被添加手势的 view
/** 图片 */ @property (nonatomic,strong) UIImageView *imageView; /** 数组 */ @property (nonatomic,strong) NSArray *images; /** 图片张数 */ @property int count;
_count = 0; _images = @[[UIImage imageNamed:@"00"],[UIImage imageNamed:@"01"],[UIImage imageNamed:@"02"]]; _imageView = [[UIImageView alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width / 2 - 50, [UIScreen mainScreen].bounds.size.height / 2 -100, 100, 200)]; _imageView.image = _images[_count]; _imageView.contentMode = UIViewContentModeScaleAspectFit; [self.view addSubview:_imageView];
手势需要开启用户交互
//手势需要开启用户交互 _imageView.userInteractionEnabled = YES;
点击手势
单击手势//单击手势 UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)]; [_imageView addGestureRecognizer:singleTap];
双击手势 添加 numberOfTapsRequired属性 能判断点击次数
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapAction:)]; //判断点击次数 doubleTap.numberOfTapsRequired = 2; [singleTap requireGestureRecognizerToFail:doubleTap]; [_imageView addGestureRecognizer:doubleTap];
三击手势
UITapGestureRecognizer *threeTop = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(TapGestureAction:)]; threeTop.numberOfTapsRequired = 3; [doubleTap requireGestureRecognizerToFail:threeTop]; [_imageView addGestureRecognizer:threeTop];
点击事件方法
-(void)TapGestureAction:(UITapGestureRecognizer *)sender { if (sender.numberOfTapsRequired == 1) { NSLog(@"单击"); } else if (sender.numberOfTapsRequired == 2) { NSLog(@"双击"); } else { NSLog(@"三击"); } }
轻扫手势
向左轻扫UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeAction:)]; leftSwipe.direction = UISwipeGestureRecognizerDirectionLeft; //左 [_imageView addGestureRecognizer:leftSwipe];
向右轻扫
UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeAction:)]; rightSwipe.direction = UISwipeGestureRecognizerDirectionRight; [_imageView addGestureRecognizer:rightSwipe];
轻扫手势(左右)的事件方法
-(void)swipeAction:(UISwipeGestureRecognizer *)sender { switch (sender.direction) { case UISwipeGestureRecognizerDirectionLeft: { NSLog(@"向左轻扫"); if (_count > _images.count - 2) { //扫到最右一张弹出警示框 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"最后一张" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *sure = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; [alertController addAction:sure]; [self presentViewController:alertController animated:YES completion:nil]; break; } [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1.0f]; [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:_imageView cache:YES]; [UIView commitAnimations]; _imageView.image = _images[++_count]; } break; case UISwipeGestureRecognizerDirectionRight: { NSLog(@"向右轻扫"); if (_count < _images.count - 2) { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"第一张" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *sure = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; [alertController addAction:sure]; [self presentViewController:alertController animated:YES completion:nil]; break; } [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1.0f]; [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:_imageView cache:YES]; [UIView commitAnimations]; _imageView.image = _images[--_count]; } default: break; } }
拖动手势
拖动UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureAction:)]; [_imageView addGestureRecognizer:panGesture]; ```` - **拖动事件方法** <div class="se-preview-section-delimiter"></div> ```objc -(void)panGestureAction:(UIPanGestureRecognizer *)sender { NSLog(@"拖动"); //转换坐标系 CGPoint point = [sender translationInView:self.view]; _imageView.center = CGPointMake(_imageView.center.x + point.x, _imageView.center.y + point.y); [sender setTranslation:CGPointZero inView:self.view]; }
旋转手势
旋转UIRotationGestureRecognizer *rotationGestur = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)]; [_imageView addGestureRecognizer:rotationGestur];
旋转事件方法
-(void)rotationAction:(UIRotationGestureRecognizer *)sender { NSLog(@"旋转"); _imageView.transform = CGAffineTransformMakeRotation(sender.rotation); }
捏合手势
捏合UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureAction:)]; [_imageView addGestureRecognizer:pinchGesture];
捏合事件方法
-(void)pinchGestureAction:(UIPinchGestureRecognizer *)sender { NSLog(@"捏合"); _imageView.transform = CGAffineTransformMakeScale(sender.scale,sender.scale); }
长按事件
长按UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)]; [_imageView addGestureRecognizer:longPress];
长按事件方法
-(void)longPressAction:(UILongPressGestureRecognizer *)sender { NSLog(@"长按"); if (sender.state == UIGestureRecognizerStateBegan) { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *cancle = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { }]; [alertController addAction:cancle]; UIAlertAction *savePhoto = [UIAlertAction actionWithTitle:@"保存到相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { UIImageWriteToSavedPhotosAlbum(_imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL); }]; [alertController addAction:savePhoto]; UIAlertAction *openPhoto = [UIAlertAction actionWithTitle:@"打开相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; //资源类型为打开相册 picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; picker.delegate = self; //选择后的图片可以被编辑 picker.allowsEditing = YES; [self presentViewController:picker animated:YES completion:nil]; }]; [alertController addAction:openPhoto]; UIAlertAction *turnonCamer = [UIAlertAction actionWithTitle:@"打开相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.sourceType = UIImagePickerControllerSourceTypeCamera; picker.delegate = self; picker.allowsEditing = YES; [self presentViewController:picker animated:YES completion:nil]; }]; [alertController addAction:turnonCamer]; [self presentViewController:alertController animated:YES completion:^{ }]; } }
保存照片的事件方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { NSString *msg = nil; if (!error) { msg = @"保存成功"; } else { msg = @"图片保存失败"; } NSLog(@"%@",msg); }
打开相册和打开相机的事件方法
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info { **//打开相机** if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) { _imageView.image = info[@"UIImagePickerControllerEditedImage"]; } **//打开相册** else { NSLog(@"info = %@",info); //获取永华编辑之后的图片 _imageView.image = info[@"UIImagePickerControllerEditedImage"]; } [self dismissViewControllerAnimated:YES completion:nil]; }
相关文章推荐
- iOS开发手记-仿QQ音乐播放器动态歌词的实现
- iOS开发遇到 Missing iOS Distribution signing identity for XXXXXX
- iOS中ASI和AFN的区别
- iOS蓝牙开发(二):iOS连接外设的代码实现
- iOS蓝牙开发(一)蓝牙相关基础知识
- iOS TableView 默认选中某行
- iOS Runtime原理及使用
- iOS TextField改变placeholder颜色的方法
- GBK编码转NSString
- iOS Xcode工程目录的 folder 和 group的区别(蓝色和黄色文件夹的区别)
- ios 获取音乐库音乐相关
- iOS NSFileManager文件系统的管理
- iOS AutoLayout的用法
- iOS中使用AVPLayer自定义视频播放器
- iOS模拟器录屏转gif神器
- iOS Programming GitHub
- iOS海哥开发笔记(MapKit的使用)
- iOS 处理方法中的可变參数
- iOS模拟器的应用沙盒在MAC中的位置
- iOS - 性能优化