UIGestureRecognizer手势

本文详细介绍了UIKit中的手势识别器,包括轻击、捏合、拖动、长按、滑动和旋转手势的使用方法,通过实例展示了如何在实际场景中应用这些手势识别器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UIGestureRecognizer手势

目录

1.什么是手势以及手势的种类
2.手势的添加及常用属性
3.多种手势并用

1.什么是手势以及手势的种类

UIKit中包含了UIGestureRecognizer类,用于检测发生在设备中的手势。UIGestureRecognizer基类是一个抽象类,定义了所有手势的基本行为,我们主要是使用它的子类,它有下面一些子类用于处理具体的手势:

1、UITapGestureRecognizer          轻击手势(点一下) 
2、UIPinchGestureRecognizer        捏合手势(二指往內或往外拨动,用于缩放)  
3、UIPanGestureRecognizer          拖动手势(摇动或者拖拽)  
4、UISwipeGestureRecognizer        轻扫手势(擦碰) 
5、UIRotationGestureRecognizer     旋转手势(旋转,手指朝相反方向移动)  
6、UILongPressGestureRecognizer    长按手势(长按)

对于不同类型的手势识别器,具有不同的配置属性。比如UITapGestureRecognizer,可以配置拍击次数。界面接收到手势之后,可以发送一个消息,用于处理响应手势动作后的任务。当然,不同的手势识别器,发送的消息方法也会有所不同。

2.手势的添加及常用属性

添加手势时,一般是给某一个试图添加一个手势,例如给UIView,UIImageView添加手势,使之实现轻击、旋转、捏合、拖动、长按、滑动等事件。下面以给UIImageView添加手势为例说明6种手势的使用。

  • 1.UITapGestureRecognizer 轻击手势

代码:


    // 创建一个轻击手势对象,当轻击事件发生,就会调用self里的tap:这个方法
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];

    // 设置点击需要的手指头的个数!
    tap.numberOfTapsRequired = 2;

    //将手势添加到图片视图上
    [_imageView addGestureRecognizer:tap];

// 双击时执行的方法:双击放大
- (void)tap:(UITapGestureRecognizer *)tap {
    [UIView animateWithDuration:0.5 animations:^{
        _imageView.transform = CGAffineTransformScale(_imageView.transform, 1.1, 1.1);
    }];
}

代码说明

(1) 创建轻击手势使用UITapGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法,当手势发生的时候,就会调用target对象的action方法。

(2) 手势的numberOfTouchesRequired属性意思是点击需要的手指头的个数,这个属性类型是NSUInteger,不设置的情况下默认是1,单击时就会触发事件,设置成2时,则点击两次才会触发target对象的action事件。

(3) 获取当前的图片视图_imageView,使用这个视图的addGestureRecognizer:添加手势tap,这样就可以在轻击的时候实现target对象的action方法了。

  • 2.UIPinchGestureRecognizer 捏合手势

代码:

    // 创建一个捏合手势
    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
    pinch.delegate = self;
    [_imageView addGestureRecognizer:pinch];

- (void)pinch:(UIPinchGestureRecognizer *)pinch {
    // pinch.scale 比例,  pinch.velocity 强度  比例/s
    _imageView.transform = CGAffineTransformScale(_imageView.transform, pinch.scale, pinch.scale);
    // 重新设置比例为1.
    pinch.scale = 1;
}

代码说明

(1) 创建捏合手势使用UIPinchGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法,当手势发生的时候,就会调用target对象的action方法。

(2) 同样使用视图的addGestureRecognizer:添加手势捏合,捏合手势多用于放大或缩小图片视图。

  • 3.UIPanGestureRecognizer 拖动手势

代码:

    // 创建一个拖动手势
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dealPan:)];
    //将手势添加到图片视图上
    [imageView addGestureRecognizer:pan];

//消息方法dealPan:
-(void)dealPan:(UIPanGestureRecognizer *)pan
{
    //获取拖移的位置
    //屏幕上位置
    CGPoint screenPoint = [pan locationInView:self.view];

    imageView.center = screenPoint;
}

代码说明

(1) 使用UIPanGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法创建拖动手势,当手势发生的时候,就会调用target对象的action方法。

(2) 同样使用视图的addGestureRecognizer:方法给图片视图添加拖动手势,当拖动视图时,就会调用-(void)dealPan:(UIPanGestureRecognizer *)pan这个方法,手势的locationInView:方法会获取手势在视图上移动的点,再将这个点设置为图片视图的中心点,图片视图就会随着手指移动的方向而移动。

  • 4.UISwipeGestureRecognizer 轻扫手势

代码:

    // 创建一个轻扫手势,当发生时,就调用self的swipe:方法
    UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    // 设置轻扫的方向, 枚举 (上下左右) ,注意,这个枚举值不要或在一起用
    swipe.direction = UISwipeGestureRecognizerDirectionRight;
    [_imageView addGestureRecognizer:swipe]; 

//消息方法
// 往右扫透明度降低
- (void)swipe:(UISwipeGestureRecognizer *)swipe {
    if (_imageView.alpha > 0.1) {
        _imageView.alpha -= 0.1;
    }
}

代码说明

(1) 使用UISwipeGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法创建清扫手势,当手势发生的时候,就会调用target对象的action方法。

(2) 设置清扫手势的direction属性,意思是清扫的方向,这个属性类型是UISwipeGestureRecognizerDirection,是一个枚举,值都有UISwipeGestureRecognizerDirectionRight,UISwipeGestureRecognizerDirectionLeft,
UISwipeGestureRecognizerDirectionUp,
UISwipeGestureRecognizerDirectionDown,
分别设置不同清扫方向下的action方法。

(3) 同样使用视图的addGestureRecognizer:方法给图片视图添加清扫手势,当按照一定的方向清扫图片视图时,就会调用- (void)swipe:(UISwipeGestureRecognizer *)swipe这个方法,每清扫一次图片视图的透明度就会降低0.1。

  • 5.UIRotationGestureRecognizer 旋转手势

代码:

    // 创建一个旋转手势,当发生时,就调用self的rotation:方法
    UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];

    // 将旋转手势的代理,设置为rootViewController
    rotation.delegate = self;

    //添加手势
    [_imageView addGestureRecognizer:rotation];

//消息方法rotation:
- (void)rotation:(UIRotationGestureRecognizer *)rotation {
    // NSLog(@"%.2f", rotation.rotation);
    // 旋转弧度,在已经旋转的基础上,继续旋转。
    // rotation.velocity 旋转的强度 rotation/s
    _imageView.transform = CGAffineTransformRotate(_imageView.transform, rotation.rotation);
    // 将旋转之后的角度清0!
    rotation.rotation = 0;
}

代码说明

(1) 使用UIRotationGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法创建旋转手势。

(2) 同样使用视图的addGestureRecognizer:方法给图片视图添加旋转手势,当用手指旋转视图时,就会调用- (void)rotation:(UIRotationGestureRecognizer *)rotation这个方法,从而使图片发生旋转。

  • 6.UILongPressGestureRecognizer 长按手势

代码:

    // 创建一个长按手势
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
    // 最小的持续时间
    longPress.minimumPressDuration = 2.0;
    // 允许移动的最大范围
    longPress.allowableMovement = 5.0;
    // 图片视图上添加手势
    [_imageView addGestureRecognizer:longPress];    

// 长按手势,会触发两次,一次是手势发生了,一次是抬起
- (void)longPress:(UILongPressGestureRecognizer *)longPress {
    // 判断状态,只在手势发生的时候执行if里的语句
    if (longPress.state == UIGestureRecognizerStateBegan) {
        UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"哎呦" message:@"哎呦" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        [av show];
    }
}

代码说明

(1) 使用UILongPressGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法创建长按手势。

(2) 长按手势的minimumPressDuration属性意思是最小的持续时间,只有长按的时间大于这个最小持续时间才会判定手势为长按手势,这个属性类型是CFTimeInterval,需要传入一个时间间隔,不设置的情况下默认是0.5,即长按时间只要超过0.5秒就会触发action方法。

(3) 长按手势的allowableMovement属性意思是允许移动的最大范围,这个属性类型是CGFloat,需要传入一个CGFloat对象,不设置的情况下默认是10,即长按手势移动的距离超过10,action方法就不会被触发。

(4) 同样使用视图的addGestureRecognizer:方法给图片视图添加长按手势,当长按视图时,就会调用- (void)longPress:(UILongPressGestureRecognizer *)longPress这个方法,弹出一个警告框UIAlertView。但是这个方法会被调用两次,一次是手势发生的时候,一次是手抬起的时候。可以利用长按手势的state属性来判断手势的状态是否是UIGestureRecognizerStateBegan,即手势开始发生的时候,从而使长按手势事件只会被调用一次。

3.多种手势并用
// 创建一个轻击手势对象,当轻击事件发生,就会调用self里的tap:这个方法
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];

    // 设置点击需要的手指头的个数!
    tap.numberOfTapsRequired = 2;

    //将手势添加到图片视图上
    [_imageView addGestureRecognizer:tap];

    // 对于视图控件,可以添加多个手势 (也不宜太多)
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];

    [_imageView addGestureRecognizer:singleTap];
    // singleTap 这个手势响应,要在tap手势响应失败后,才触发。
    [singleTap requireGestureRecognizerToFail:tap];


// 双击时执行的方法:双击放大
- (void)tap:(UITapGestureRecognizer *)tap {
    [UIView animateWithDuration:0.5 animations:^{
        _imageView.transform = CGAffineTransformScale(_imageView.transform, 1.1, 1.1);
    }];
}

// 单击时执行的方法:单击缩小
- (void)singleTap:(UITapGestureRecognizer *)tap {
    [UIView animateWithDuration:0.5 animations:^{
        _imageView.transform = CGAffineTransformScale(_imageView.transform, 0.9, 0.9);
    }];
}
内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值