UIGestureRecognizer

UIKit框架中一共提供了6种类型的手势操作,分别为:点击、捏合、旋转、滑动、拖动、长按。手势需要添加到UIView类以及其子类之上,同时每个UIView可以添加多个手势。

1.UIGestureRecognizer类

UIGestureRecognizer类是一个抽象类,不能直接使用,具体使用过程中需要使用其子类。UIGestureRecognizer一共包括6个子类,分别对应6种手势。

UITapGestureRecognizer:点击。
UIPinchGestureRecognizer:捏合。
UIRotationGestureRecognizer:旋转。
UISwipeGestureRecognizer:滑动。
UIPanGestureRecognizer:拖动,其又包含另外一个子类UIScreenEdgePanGestureRecognizer。
UILongPressGestureRecognizer:长按。
UIGestureRecognizer创建方法创建一个UIGestureRecognizer子类对象需要以下3个步骤:
使用- initWithTarget:action:方法创建一个手势类对象,设置当手势事件发生时,调用的方法。
使用addGestureRecognizer:方法,把手势对象添加到一个UIView的对象上。
实现手势事件发生时所调用的方法。
UIGestureRecognizer类常用属性以及方法
// 初始化手势对象并设置手势发生时调用的方法。
-(instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action;
// 获取手势点击的位置
-(CGPoint)loctionOfTouch:(touchIndex) inView:(nullable UIView*)view;
// 获取手势点击的状态和视图
@property(nonatomic, readonly) UIGestureRecognizerState state;
// 其中常用的UIGestureRecognizerState有以下几个:
UIGestureRecognizerStateBegan:开始手势事件
UIGestureRecognizerStateEnded:结束手势事件
UIGestureRecognizerStateChanged:手势位置发生变化
UIGestureRecognizerStateFailed:无法识别的手势
// 手势事件对应的视图对象
@property(nullable, nonatomic, readonly) UIView *view;

2.点击手势UITapGestureRecognizer

UITapGestureRecognizer类可以用于创建识别点击手势,常用的属性包括:
// 需要点击的次数,用于识别单击或双击,默认为单击。
@property(nonatomic) NSInteger numberOfTapsRequired;
// 点击的手指数,默认为:1
@property(nonatomic) NSInteger numberOfTouchesRequired;

// 单个手指单击手势实现
-(void)viewDidLoad {
    [super viewDidLaod];
    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 250, 250)];
    myView.backgroundColor = [UIColor redColor];
    [self.view addSubView:myView];

/*********************************************/
    // 单击单手指
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
    // 单击
    singleTap.numberOfTapsRequired = 1;
    // 单手指
    singleTap.numberOfTouchesRequired = 1;
/*********************************************/
    // 双击双手指
    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];
    // 双击
    doubleTap.numberOfTapsRequired = 2;
    // 双手指
    doubleTap.numberOfTouchesRequired = 2;
/********************************************/

    // 添加到myView
    [myView addGetsureRecognizer:singleTap];
    [myView addGetsureRecognizer:doubleTap];
}
// 实现单击手势触发后的调用的singleTap:方法。
-(void)singleTap:(UITapGestureRecognizer *) tap {
    NSLog(@"    ");
}

3.捏合与旋转手势UIPinchGestureRecognizer

// 捏合手势UIPinchGestureRecognizer可以获取手势在屏幕坐标系中的缩放比例,根据该缩放比例,可以调整UIView控件的缩放。
@property(nonatomic) CGFloat scale;
// 旋转手势UIRotationGestureRecognizer可以获取手势在屏幕坐标系中的旋转角度,根据该旋转角度,可以调整UIView控件的角度。
@property(nonatomic) CGFloat rotation;

// 捏合手势示例代码
-(void)viewDidLoad {
    [super viewDidLoad];
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 250, 150, 150)];
    imageView.image = [UIImage imageNamed:@"image"];
    imageView.userInteractionEnable = YES;
    [self.view addSubview:imageView];
    // 捏合手势
    UIPinchGestureRecongizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
    // 旋转手势
    UIRotationGestureRecongizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
    //
    [imageView addGestureRecognizer:pinchGesture];
    [imageView addGestureRecognizer:rotationGesture];
}
// 实现图片缩放功能
-(void)pinch:(UIPinchGestureRecognizer  *)gesture {
    CGFloat scale = gesture.scale;
    gesture.view.transform = CGAffineTransformScale(gesture.view.transform, scale, scale)
    // 一定要把scale的值重置为1,否则回影响缩放效果,会进一步进行缩放
    gesture.scale = 1;
}
// 实现图片旋转功能
-(void)rotation:(UIPinchGestureRecognizer  *)gesture {
    CGFloat rotation = gesture.rotation;
    gesture.view.transform = CGAffineTransformRotate(gesture.view.transform, rotation)
    // 一定要把rotation的值重置为0,否则回影响旋转效果
    gesture.rotation = 0;
}
// 

4.滑动手势UISwipeGestureRecognizer

滑动手势(UISwipeGestureRecognizer)常用于照片管理类App,能够实现照片的滑动显示。滑动手指支持向上、向下、向左、向右四个方面的滑动,在创建滑动手势对象时,需要通过direction属性来指定滑动的方向,默认的滑动方向为向右滑动。

@property(nonatomic) UISwipeGestureRecognizerDirection direction;
其中,UISwipeGestureRecognizerDirection的取值包括以下几点。UISwipeGestureRecognizerDirectionRight:向右,默认。
UISwipeGestureRecognizerDirectionLeft:向左。
UISwipeGestureRecognizerDirectionUp:向上。
UISwipeGestureRecognizerDirectionDown:向下。

// 示例
-(void)viewDidLoad {
     [super viewDidLoad];
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 250, 150, 150)];
    imageView.image = [UIImage imageNamed:@"image"];
    imageView.userInteractionEnable = YES;
    [self.view addSubview:imageView];
    // 滑动手势
    UISwipeGestureRecognizer *swipeRightGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    UISwipeGestureRecognizer *swipeLeftGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    swipeLeftGesture.direction = UISwipeGestureRecognizerDirectionLeft;
    [imageView addGestureRecognizer:swipeRightGesture];
    [imageView addGestureRecognizer:swipeLeftGesture];
    self.imageIndex = 0;
}

.5 拖动手势UIPanGestureRecognizer

拖动手势(UIPanGestureRecognizer)可以修改一个UI控件的位置,在有些游戏类App中比较常见。拖动事件发生时,通过translationInView:方法,可以得到一个CGPoint类型的返回值,即位置的偏移量,可以根据偏移量修改对应UI控件的center属性从而实现UI控件的位置移动效果。

-(CGPoint)translationInView:(nullable UIView *) view;

// 示例
-(void)viewDidLoad {
     [super viewDidLoad];
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 250, 150, 150)];
    imageView.image = [UIImage imageNamed:@"image"];
    imageView.userInteractionEnable = YES;
    [self.view addSubview:imageView];
    // 拖动手势
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    [imageView addGestureRecognizer:panGesture];
}
// pan:方法,实现UI控件位置更新操作。
-(void) pan:(UIPanGestureRecognizer *)gesture {
    CGPoint tranclation = [gesture translationInView.view];
    gesture.view.center = CGPointMake(gesture.view.x + translation.x, gesture.view,y + translation.y);
    [gesture setTranslation:CGPointZero inView:self.view];
}

6 长按手势UILongPressGestureRecognizer

通过长按手势(UILongPressGestureRecognizer)可以监控手势作用于UI控件的开始长按、长按过程中以及松开等状态,并且设置不同的动作。最常见的应用案例可以参考微信的对讲模式,按住按钮即可开始录音,松开后结束录音并发送给对方。长按手势一定需要和UIGestureRecognizer类的state属性进行配合使用,即通过不同状态state下,实现不同的功能。UIGestureRecognizer类的state属性中,常见的有以下几个。

UIGestureRecognizerStateBegan:开始手势事件;
UIGestureRecognizerStateEnded:结束手势事件;
UIGestureRecognizerStateChanged:手势位置发生变化;
UIGestureRecognizerStateFailed:无法识别的手势。
// 示例
-(void)viewDidLoad {
     [super viewDidLoad];
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 250, 150, 150)];
    imageView.image = [UIImage imageNamed:@"image"];
    imageView.userInteractionEnable = YES;
    [self.view addSubview:imageView];
    // 长按手势
    UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
    [imageView addGestureRecognizer:longPressGesture];
}
-(void)longPress:(UILongPressGestureRecognizer *) gesture {
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值