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];
}