关于UILongPressGestureRecognizer和UIPanGestureRecognizer同时使用

本文详细介绍了如何在iOS设备上自定义一款键盘应用,通过长按数字键并拖动至字母区域来选择特定字母,实现流畅的输入体验。包括手势识别、位置获取与字母对应逻辑的实现。

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

        最近在尝试自己做一款iOS键盘,长按数字键之后会出现相应的几个字母来选择,然后手不离开屏幕,直接拖动至需要选择的字母的上,松手时就会输入相应的字母。首先需要有一个长按手势:

UILongPressGestureRecognizer *longPressDrag = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDrag:)];
longPressDrag.minimumPressDuration = 0.5;

-(void)longPressDrag:(UILongPressGestureRecognizer *)sender
{
}

        当长按0.5s时,长按手势开始,松开手时长按手势结束,两种情况下都会调用longPressDrag:方法,此时可以滑动,用

CGPoint point = [sender locationInView:floatView];

来获得手指所处的位置,再经过计算就可以得出手指停在哪个字母上,并进行相应的处理。

        这里不需要使用UIPanGestureRecognizer,当长按手势的state为UIGestureRecognizerStateBegan时滑动手指就相当于调用了UIPanGestureRecognizer,不需要再另外定义一个Pan手势。也就是在长按手势开始后到长按手势结束,期间滑动手指会一直跟踪手指的坐标,不断调用longPressDrag:方法。下面是完整的源代码:

-(void)longPressDrag:(UILongPressGestureRecognizer *)sender
{
    //获取手指相对于floatView坐标,floatView为放置字母列表的view
    CGPoint point = [sender locationInView:floatView];
    //手势开始时弹出floatView
    if(sender.state == UIGestureRecognizerStateBegan)
    {
       // ToDo:在这里自己定义需要出现的东西
    }
    
    //判断手指是否在floatView的范围内
    if(CGRectContainsPoint(floatView.frame, [floatView convertPoint:point toView:self]))
    {
        //ToDo:利用变量point来计算手指位于第几个字母上
        
        //手势结束,如果结束时停在了某个字母上则相当于选择了那个字母
        if(sender.state == UIGestureRecognizerStateEnded)
        {
          
        }
    }
    //手指在floatView的范围外
    else
    {
        //手势结束,没有选择任何字母,直接floatView消失
        if(sender.state == UIGestureRecognizerStateEnded)
        {
            [floatView close];
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值