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

高级手势

#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;
}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273

扩展手势

@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

来源:CSDN

上一篇: iOS系统3DTouch全解析

下一篇: ui设计和美工你可以这样理解

分享到: 更多