iOS开发之UI手势

基础手势

@property (nonatomic,strong)UIImageView *imageView;

//该方法是一个懒加载,在需要的地方才调用,节省内存
- (UIImageView *)imageView{//方法名要与属性相同
    if (!_imageView) {
        _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 70, self.view.bounds.size.width-40, self.view.bounds.size.height/2)];
        _imageView.image = [UIImage imageNamed:@"1.jpg"];
    }
    return _imageView;
}


- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.imageView];//此处相当于调用了懒加载方法

    //开启交互事件的响应,默认为NO
    _imageView.userInteractionEnabled = YES;
    //添加手势对象
    /**
     UITapGestureRecognizer 点按手势

    参数1:响应事件拥有者,self表示当前视图控制器
    参数2:响应事件方法,tapOneAction:
     */
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOneAction:)];
    //表示识别事件的类型:几次点击触发,默认值是1
    tapGesture.numberOfTapsRequired = 1;
    //几个手指点击时触发事件
    tapGesture.numberOfTouchesRequired = 1;
    //把手势添加到视图里面,视图可以响应事件
    [_imageView addGestureRecognizer:tapGesture];

    //添加双击手势
    UITapGestureRecognizer *tapGesture2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTwoAction:)];
    tapGesture2.numberOfTapsRequired = 2;//点击两次才触发事件
    tapGesture2.numberOfTouchesRequired = 1;
    [_imageView addGestureRecognizer:tapGesture2];

    //当单击操作遇到双击操作的时候,使单击操作失败(tapGesture)
    [tapGesture requireGestureRecognizerToFail:tapGesture2];  
}

//单击事件响应方法,这里使图片放大,即改变imageView的frame
- (void)tapOneAction:(UITapGestureRecognizer *)gesture{
    NSLog(@"单击");
    //获取手势监控的视图,在该imageView外面不能触发
    UIImageView *imageView = (UIImageView *)gesture.view;
    //开始动画
    [UIView beginAnimations:nil context:nil];
    //设置动画时间
    [UIView setAnimationDuration:2];
    //放大图片
    imageView.frame = self.view.bounds; 
}

//双击事件响应方法,这里使图片缩小为原来的大小
- (void)tapTwoAction:(UITapGestureRecognizer *)gesture{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:2];
    //设置_imageView为初始的frame
    _imageView.frame = CGRectMake(20, 70, self.view.bounds.size.width-40, self.view.bounds.size.height/2);
    //提交动画
    [UIView commitAnimations]; 
}

高级手势

#import "ViewController.h"

@interface ViewController ()<UIGestureRecognizerDelegate>
//UIGestureRecognizerDelegate 同时进行旋转、缩放的协议

@property (nonatomic,strong)UIImageView *imageView;

//定义一个缩放手势手势,用来对视图进行放大缩小
//捏合手势
@property (nonatomic,strong)UIPinchGestureRecognizer *pinGesture;
//旋转手势
@property (nonatomic,strong)UIRotationGestureRecognizer *rotationGesture;

@end

@implementation ViewController
//懒加载
- (UIImageView *)imageView {
    if (!_imageView) {
        _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 70, self.view.bounds.size.width-40, self.view.bounds.size.height/2)];
        _imageView.image = [UIImage imageNamed:@"2.jpg"];

    }
    return _imageView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.imageView];
    //开启交互
    _imageView.userInteractionEnabled = YES;
    //创建一个捏合手势
    _pinGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinGesture:)];
    [_imageView addGestureRecognizer:_pinGesture];
    //创建一个旋转手势
    _rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)];
    [_imageView addGestureRecognizer:_rotationGesture];

    //设置两种手势的代理为self
    _pinGesture.delegate = self;
    _rotationGesture.delegate = self;
}

//实现协议的方法
//是否可以同时响应两个手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {//Simultaneously 同时的
    //如果返回YES,可以同时响应
    return YES;
}

- (void)pinGesture:(UIPinchGestureRecognizer *)gesture {
    //获取监控图像视图
    UIImageView *imgView = (UIImageView *)gesture.view;

    //对图像视图对象进行矩阵计算并且赋值
    //transform:表示图像学中的变换矩阵
    //CGAffineTransformScale:通过缩放产生一个新的矩阵(在原来的基础上)
    //p1:原来的矩阵
    //p2:x方向缩放的比例
    //p3:y方向缩放的比例
    imgView.transform = CGAffineTransformScale(imgView.transform, gesture.scale, gesture.scale);
    //返回的是新的缩放之后变化矩阵的比例
    gesture.scale = 1;
}

- (void)rotationAction:(UIRotationGestureRecognizer *)rotationGesture {
    //获取监控图像视图
    UIImageView *imgView = (UIImageView *)rotationGesture.view;
    imgView.transform = CGAffineTransformRotate(imgView.transform, rotationGesture.rotation);
    //对角度进行清零
    rotationGesture.rotation = 0;
}

扩展手势

@interface ViewController ()<UINavigationControllerDelegate, UIImagePickerControllerDelegate>

@property (nonatomic,strong)UIImageView *imageView;

@end

@implementation ViewController

- (UIImageView *)imageView {
    if (!_imageView) {
        _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 70, self.view.bounds.size.width-40, self.view.bounds.size.height/2)];
        _imageView.image = [UIImage imageNamed:@"2.jpg"];

    }
    return _imageView;
}


- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.imageView];
    _imageView.userInteractionEnabled = YES;

    //创建一个平移手势
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
    //添加手势
    [_imageView addGestureRecognizer:panGesture];

    //创建一个轻扫手势
    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeAction:)];
    swipeGesture.direction = UISwipeGestureRecognizerDirectionUp;
    [_imageView addGestureRecognizer:swipeGesture];

    //创建一个长按手势
    UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longAction:)];
    //设置长按手势的时间,默认0.5秒为长按手势
    longGesture.minimumPressDuration = 1.0;
    [_imageView addGestureRecognizer:longGesture];
}

//平移手势
//只要手指在屏幕坐标上发生变化的时候就会调用该方法
- (void)panAction:(UIPanGestureRecognizer *)panGesture {
//    NSLog(@"平移手势");
//    //获得移动的坐标,相对于视图的坐标系
    CGPoint point = [panGesture translationInView:self.view];//translation 平移
    _imageView.center = CGPointMake(_imageView.center.x + point.x, _imageView.center.y + point.y);
    //在指定视图的坐标系中设置平移值
    [panGesture setTranslation:CGPointZero inView:self.view];
//    NSLog(@"point.x = %f,point.y = %f",point.x,point.y);
//    //获取平移时的相对速度(每秒在屏幕上滑动移动像素的值)
    CGPoint pv = [panGesture velocityInView:self.view];
//    NSLog(@"pv.x = %.2f,pv.y = %.2f",pv.x,pv.y);

}

//轻扫手势
- (void)swipeAction:(UISwipeGestureRecognizer *)swipeGesture {
    NSLog(@"向上");
}

//长按手势
- (void)longAction:(UILongPressGestureRecognizer *)longGesture {
    if (longGesture.state == UIGestureRecognizerStateBegan) {
        NSLog(@"开始状态");

        UIAlertController *alertC = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
        UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"保存到相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            NSLog(@"保存到相册");
            UIImageWriteToSavedPhotosAlbum(_imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
        }];
        [alertC addAction:action1];
        UIAlertAction *action2 = [UIAlertAction actionWithTitle:@"打开相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            NSLog(@"打开相册");
            /**
             sourceType:
             UIImagePickerControllerSourceTypePhotoLibrary,    图片列表
             UIImagePickerControllerSourceTypeCamera,          摄像头
             UIImagePickerControllerSourceTypeSavedPhotosAlbum 相册
             */
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            //资源类型
            picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            picker.delegate = self;
            //选择图片后是否可以被编辑
            picker.allowsEditing = YES;
            //推送picker控制器
            [self presentViewController:picker animated:YES completion:nil];

        }];
        [alertC addAction:action2];
        UIAlertAction *action3 = [UIAlertAction actionWithTitle:@"打开相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            NSLog(@"打开相机");
            //要使用真机来测试
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            picker.sourceType = UIBarButtonSystemItemCamera;
            picker.delegate = self;
            picker.allowsEditing = YES;
            [self presentViewController:picker animated:YES completion:nil];


        }];
        [alertC addAction:action3];
        UIAlertAction *action4 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
            NSLog(@"取消");
        }];
        [alertC addAction:action4];
        //推出alertC!!
        [self presentViewController:alertC animated:YES completion:^{

        }];

    }
    else if (longGesture.state == UIGestureRecognizerStateEnded){
        NSLog(@"结束状态");
    }

    NSLog(@"长按");
}

//保存图片方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    if (!error) {
        NSLog(@"图片保存成功");
    }
    else {
        NSLog(@"图片保存失败");
    }
}


#pragma mark --UIImagePickerControllerDelegate--
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {

    if (picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary) {

        NSLog(@"%@",info);
        //照片的原始数据
        _imageView.image = info[UIImagePickerControllerOriginalImage];
        //退出picker!!!
    }
    else if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
        _imageView.image = info[UIImagePickerControllerOriginalImage];
    }
    [picker dismissViewControllerAnimated:YES completion:nil];
}

//- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
//    
//    NSLog(@"取消");
//}
@end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值