如何让 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 忽略触摸而不释放它?的主要内容,如果未能解决你的问题,请参考以下文章