ios之UIGestureRecognizer手势基础使用解析

UIGestureRecognizer 的子类分别有很多手势,通过 不用的手势可以执行不同的操作,下面来介绍下他们的基本使用方法所有手势配置基本相同,只是针对不同的手势里面有部分属性可以设置,比如说tap点进去看他有两个参数可以设置一个是点击次数,和点击手指数可设置。如果不知道这个手势能配置说明参数,那么点击进入相应的.h 文件查看

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(processGestureRecongnizer:)];//点击手势
    [tapGesture setNumberOfTouchesRequired:1];
    [tapGesture setNumberOfTapsRequired:1];
    [_view addGestureRecognizer:tapGesture];
    [tapGesture release];
- (void)processGestureRecongnizer:(UIGestureRecognizer *)gesture
{
    if ([gesture isKindOfClass:[UITapGestureRecognizer class]]) {
        [self positionAnimation];
    }
}

#pragma mark -- InitUserInterface
- (void)initUserInterface
{
    _view = [[UIView alloc]init];
    [_view setBounds:CGRectMake(0, 0, 200, 200)];
    [_view setCenter:CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds))];
    [_view setBackgroundColor:[UIColor grayColor]];
    [self.view addSubview:_view];
    //两手指拨动手势
    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(processGestureRecognizer:)];
    [pinch setDelegate:self];//设置代理
    [_view addGestureRecognizer:pinch]; //对view添加这个手势
    [pinch release];
    //旋转手势
    UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(processGestureRecognizer:)];
    [rotation setDelegate:self];
    [_view addGestureRecognizer:rotation];
    [rotation release];
    //长按手势
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(processGestureRecognizer:)];
    longPress.minimumPressDuration = 2;
    [_view addGestureRecognizer:longPress];
    [longPress release];
    //滑动手势--左
    UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(processGestureRecognizer:)];
    [leftSwipe setDirection:UISwipeGestureRecognizerDirectionLeft];//配置滑动方向
    [self.view addGestureRecognizer:leftSwipe];
    [leftSwipe release];
    //滑动手势--右
    UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(processGestureRecognizer:)];
    [rightSwipe setDirection:UISwipeGestureRecognizerDirectionRight];
    [self.view addGestureRecognizer:rightSwipe];
    [rightSwipe release];
    //拖移手势
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(processGestureRecognizer:)];
    [pan setDelegate:self];
    [_view addGestureRecognizer:pan];
    [pan release];
    

}
#pragma mark -- GestureRrecognizer methods
//代理方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return NO;
}
// 手势action 让对应的手势执行相应地操作
- (void)processGestureRecognizer:(UIGestureRecognizer *)gesture
{
    //判断手势类型
    if ([gesture isKindOfClass:[UIPinchGestureRecognizer class]])
    {
        UIPinchGestureRecognizer *pinch = (UIPinchGestureRecognizer *)gesture;
        static float lastScale;//静态变量记录上次大小
        if (pinch.state == UIGestureRecognizerStateBegan) {
            lastScale = pinch.scale;// 手势开始把初始scale赋给静态变量方便更新
        }else if (pinch.state == UIGestureRecognizerStateChanged){
            [_view setTransform:CGAffineTransformScale(_view.transform, 1+(pinch.scale - lastScale), 1+(pinch.scale - lastScale))];//让View进行动态的放大或缩小
            lastScale = pinch.scale;// 更新scale的值 --(这样做让view保持变化后的状态而不会是初始状态)
            //此方法不需要更新lastScale的值  都是从原型开始
//            [_view setTransform:CGAffineTransformMakeScale(1+(pinch.scale - lastScale), 1+(pinch.scale - lastScale))];
        }
    }else if ([gesture isKindOfClass:[UIRotationGestureRecognizer class]])
    {
        UIRotationGestureRecognizer *rotation = (UIRotationGestureRecognizer *)gesture;
        static float lastRotation;
        if (rotation.state == UIGestureRecognizerStateBegan) {
            lastRotation = rotation.rotation;
        }else if (rotation.state == UIGestureRecognizerStateChanged){
            [_view setTransform:CGAffineTransformRotate(_view.transform, rotation.rotation - lastRotation)];
            lastRotation = rotation.rotation;
        }
    }
    else if ([gesture isKindOfClass:[UILongPressGestureRecognizer class]])
    {
        UILongPressGestureRecognizer *longPress = (UILongPressGestureRecognizer *)gesture;
        if (longPress.state == UIGestureRecognizerStateBegan) {
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"Long Press Begin" delegate:self cancelButtonTitle:@"确定" otherButtonTitles: nil];
            [alert show];
            [alert release];
        }
    }
    else if ([gesture isKindOfClass:[UISwipeGestureRecognizer class]])
    {
        UISwipeGestureRecognizer *swipe = (UISwipeGestureRecognizer *)gesture;
        if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {
            [UIView animateWithDuration:1 animations:^{
                [_view setCenter:CGPointMake(CGRectGetMinX(self.view.bounds), CGRectGetMidY(self.view.bounds))];
            }];
        }else{
            [UIView animateWithDuration:1 animations:^{
                [_view setCenter:CGPointMake(CGRectGetMaxX(self.view.bounds), CGRectGetMidY(self.view.bounds))];
            }];
        }
        
    }
    else if ([gesture isKindOfClass:[UIPanGestureRecognizer class]])
    {
        UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gesture;
        static CGPoint lastLocation;
        if (pan.state == UIGestureRecognizerStateBegan) {
            lastLocation = _view.center;
        }else if (pan.state == UIGestureRecognizerStateChanged)
        {
            CGPoint translationPoint = [pan translationInView:self.view];
            _view.center = CGPointMake(translationPoint.x + lastLocation.x, translationPoint.y+ lastLocation.y);
        }else if (pan.state == UIGestureRecognizerStateEnded)
        {
            lastLocation = CGPointZero;
        }
    }
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。