iPhone iOS如何将UILongPressGestureRecognitor和UITapGestureRecognitor添加到同一控件并防止冲突?
我正在构建一个iPhone应用程序,它可以让用户重新排列屏幕上的一些UI元素 如何将轻触手势识别器和长按手势识别器添加到同一UIView?当我从长按中抬起手指时,轻触手势识别器启动。当用户执行长按时,如何临时禁用轻触手势识别器或防止其触发iPhone iOS如何将UILongPressGestureRecognitor和UITapGestureRecognitor添加到同一控件并防止冲突?,iphone,ios,uiview,uitapgesturerecognizer,long-press,Iphone,Ios,Uiview,Uitapgesturerecognizer,Long Press,我正在构建一个iPhone应用程序,它可以让用户重新排列屏幕上的一些UI元素 如何将轻触手势识别器和长按手势识别器添加到同一UIView?当我从长按中抬起手指时,轻触手势识别器启动。当用户执行长按时,如何临时禁用轻触手势识别器或防止其触发 谢谢大家! 您可以在代码中处理它,在长按期间,设置一个标志,如果在标志为true或其他情况下调用了tap,则不执行tap代码并重置标志。我不知道有什么更好的方法可以让两种手势一起工作,请实现以下委托方法: - (BOOL)gestureRecognizer:(
谢谢大家! 您可以在代码中处理它,在长按期间,设置一个标志,如果在标志为true或其他情况下调用了tap,则不执行tap代码并重置标志。我不知道有什么更好的方法可以让两种手势一起工作,请实现以下委托方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
要使长按具有第一优先级,请执行以下操作:
[点击手势要求检测识别器邮件:longPress]代码>作为替代方法,不要有两个单独的识别器-只需对两个事件使用LongPress识别器即可:
配置如下:
UILongPressGestureRecognizer* longPress = [ [ UILongPressGestureRecognizer alloc ] initWithTarget:self.nextResponder action:@selector(longPressEvent:)];
categoryPanelDrag.minimumPressDuration = 0.0;
- (BOOL)longPressEvent:(UILongPressGestureRecognizer *)gesture {
// _dragStarted is a class-level BOOL
if(UIGestureRecognizerStateBegan == gesture.state) {
_dragStarted = NO;
}
if(UIGestureRecognizerStateChanged == gesture.state) {
_dragStarted = YES;
// Do dragging stuff here
}
if(UIGestureRecognizerStateEnded == gesture.state) {
if (_dragStarted == NO)
{
// Do tap stuff here
}
else
{
// Do drag ended stuff here
}
}
return YES;
}
然后按如下方式处理:
UILongPressGestureRecognizer* longPress = [ [ UILongPressGestureRecognizer alloc ] initWithTarget:self.nextResponder action:@selector(longPressEvent:)];
categoryPanelDrag.minimumPressDuration = 0.0;
- (BOOL)longPressEvent:(UILongPressGestureRecognizer *)gesture {
// _dragStarted is a class-level BOOL
if(UIGestureRecognizerStateBegan == gesture.state) {
_dragStarted = NO;
}
if(UIGestureRecognizerStateChanged == gesture.state) {
_dragStarted = YES;
// Do dragging stuff here
}
if(UIGestureRecognizerStateEnded == gesture.state) {
if (_dragStarted == NO)
{
// Do tap stuff here
}
else
{
// Do drag ended stuff here
}
}
return YES;
}
我确实尝试过moby和journeyman的方法,但不知怎么的,他们不适合我的项目,所以我解决了如下问题
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
NSLog(@"%@ %ld",touch.description, touch.phase);
[self performSelector:@selector(checkTouch:) withObject:touch afterDelay:0.5];
return YES;
}
及
这可能是一个更简单的解决方案,但当然这取决于项目。要成功地将两者结合起来,您需要:
1º添加到标题处的界面手势代表
@interface ViewController : ViewController <UIGestureRecognizerDelegate>
4º设置手势识别器可用:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
@Softlion不要忘记.h文件上的UIGestureRecognitzerDelegate接口:-)它可以编译并运行,但不能防止冲突。我使用2个识别器和手势识别器解决了这个问题(“应该在手势识别器:)的情况下同时识别”)。回答得好,也脱下帽子。这最后一行代码就是我需要的。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}