如何让 UIView 忽略触摸而不释放它?

Posted

技术标签:

【中文标题】如何让 UIView 忽略触摸而不释放它?【英文标题】:How to make a UIView ignore touches without releasing it? 【发布时间】:2011-10-10 13:01:42 【问题描述】:

我在 UIScrollView 之上有一个透明的 UIView。 UIView 通过检查三个 touchesMoved 事件来确定是否允许滚动视图滚动。事件发生后,我希望视图禁用用户交互,以便滚动发生。用户甚至不应该注意到延迟。

但是,将视图的 userInteractionEnabled 设置为 NO,它会一直声明所有 touchesMoved 事件,直到它被释放。这意味着用户必须在能够滚动之前放开视图。

在视图也被释放之前,使用 hitTest 将不起作用。移动时不会调用 hitTest。

我会将触摸事件发送到 UIScrollView,但它很乐意忽略这些事件,因为它有自己的隐藏触摸处理。

有什么方法可以让 UIView 在不放手的情况下停止声明触摸事件?

【问题讨论】:

也许这会有所帮助? ***.com/questions/4530384/… @mja 我试过 hitTest,但它似乎只在触摸开始时调用,而不是在移动时调用。我将把它添加到问题中。不过还是谢谢。 @jamapag:哎呀。那应该是 userInteractionEnabled。我会解决的。谢谢! 【参考方案1】:

隐藏 UIView。根据文档:

一个隐藏的视图从它的窗口视觉上消失并且不接收输入事件

更多请查看类参考:http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html

【讨论】:

使用 hidden = YES 代替 userInteractionEnabled = NO 会产生同样的问题,所有 touchesMoved 事件都会发送到隐藏视图,直到用户抬起手指。我在类参考中遇到的 resignFirstResponder 也无法正常工作。不过还是谢谢。【参考方案2】:

尝试取消触摸:

How to cancel a sequence of UITouch events?

附言如有必要,我假设您正在将触摸传播给下一个响应者:

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event 
    [super touchesBegan:touches withEvent:event];
    [[self nextResponder] touchesBegan:touches withEvent:event];


- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent *)event 
    [super touchesMoved:touches withEvent:event];
    [[self nextResponder] touchesMoved:touches withEvent:event];


- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent *)event 
    [super touchesEnded:touches withEvent:event];
    [[self nextResponder] touchesEnded:touches withEvent:event];

【讨论】:

抱歉,我还没试过。我找到了一种解决方法,通过垂直滚动替换垂直拖动行为(不像听起来那么明显,对角线运动最初不应该发生)。我仍然想知道这个问题的答案,其他人也可能,我会确保在有时间的时候检查一下。

以上是关于如何让 UIView 忽略触摸而不释放它?的主要内容,如果未能解决你的问题,请参考以下文章

使用平移手势,单次触摸后忽略触摸?

UISlider 释放触摸时过于敏感

如何检测“长按”

如何在触摸释放时使 IBAction 方法无效

当很清楚并且不同的uiview可以处理它们时,如何忽略最上面的uiview中的触摸事件

如果稍后我会检测到触摸它,我应该释放添加到我的视图中的 UIImageView 吗?