在 UIButtons 上禁用 UIPanGestureRecognizer

Posted

技术标签:

【中文标题】在 UIButtons 上禁用 UIPanGestureRecognizer【英文标题】:Disable UIPanGestureRecognizer on UIButtons 【发布时间】:2014-05-27 15:37:20 【问题描述】:

我在UIView 中添加了一个UIPanGestureRecognizer,问题是当您在UIPanGestureRecognizer 中选择UIButtons 时仍处于启用状态。如何仅在按钮上禁用UIPanGestureRecognizer

【问题讨论】:

【参考方案1】:

您需要有一个手势识别器(Reference for Delegate) 的委托。例如,您的视图控制器可以是符合 UIGestureRecognizerDelegate 协议的委托。这样就可以使用方法:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

在您的委托中避免识别特定视图中的手势。

您可以通过以下方式(假定为 ARC)创建手势并将其分配给某个视图:

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(someMethodName:)];
panGesture.delegate = self;

UIView *someView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 568)];
[someView addGestureRecognizer:panGesture];

这里有更多关于如何处理手势以及避免在您感兴趣的某些视图上接收手势的详细信息:

Event handling guide for ios

基本上,您需要执行以下操作来防止按钮出现手势:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
 if ([touch view] == self.myButton)
    return NO;
 

 return YES;

返回 NO 会导致手势失败并允许其他视图继续处理触摸。

您还可以检查 [touch view] 是否是一种 UIButton,使其更通用并避免与所有按钮进行比较。

【讨论】:

完美运行。我遇到的问题是我忘记将 PanGestureRecognizer 的委托设置为 self。 我会用一个更详细的例子来完成我的回复,所以整个过程可以看到,【参考方案2】:

UIPanGestureRecognizer 分配一个委托并覆盖该方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

    return ! ([touch.view isKindOfClass:[UIButton class]]);

【讨论】:

以上是关于在 UIButtons 上禁用 UIPanGestureRecognizer的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ios 中的 UIButtons 上创建线条?

如何允许在 UIButtons 上滑动以滚动?

UIButtons 在某些设备上不起作用

如何将一组 UIButtons 添加到 UIStackview 上?

UIButtons 在横向和较小的设备上被挤压

使用 IOS9 时,无法在 UITable 的部分标题上的 UIButtons 上触发触摸事件(IOS10 很好)