最近在尝试自己做一款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];
}
}
}