您的位置:首页 > 移动开发 > IOS开发

【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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: