当我在检测到用户长按后添加新视图时,我会收到touchesCancelled事件。 但是,我想将长按事件保存到新添加的视图中。
我想要实现的是用户触摸&按住屏幕,然后添加新视图,用户可以在新添加的视图中移动触摸,而无需触摸并再次触摸。
但是,当添加新视图时,我会触摸取消事件,因此即使用户的触摸移动,添加的视图也无法接收任何触摸事件。
我正在使用UILongPressGestureRecognizer来检测用户的长按。
下面是日志消息。
MyView touchesBegan x:524 y:854
MyView handleLongPress(检测到LongPress)
NewView添加
MyView touchesCancelled x:526 y:854
并没有发生任何事......
我期待的是......
MyView touchesBegan x:524 y:854
MyView handleLongPress(检测到LongPress)
NewView添加
MyView touchesCancelled x:526 y:854
NewView touchBegan
NewView touchMoved
NewView touchMoved
NewView touchMoved
NewView touchMoved
...
有没有解决方案?
提前致谢。
答案 0 :(得分:0)
这是一个棘手的问题 - 我对解决方案的想法有点过时,但我认为它会起作用。
在整个区域添加透明视图,这是您添加长按手势识别器的视图。我将这称为拦截器视图,后面的那个将被称为可见视图。当您在拦截器视图中检测到长按时,可以将新视图添加到可见视图而不会干扰拦截器视图上的触摸,因此您可以跟踪它们并在可见视图上移动新视图。
如果您需要检测其他触摸,例如在可见视图中的按钮和其他UI元素中,则应为拦截器视图创建UIView
(InterceptorView
)的子类,覆盖hitTest:withEvent:
,如下所示:
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
// Notes:
// visibleView is a property of your InterceptorView class
// which should be set to the visible view when the interceptor
// view is created and added over the top of the visible view.
// See if there are any views in the visible view that should receive touches...
// Since the frame of the interceptor view should be the same as the frame of the
// visible view then the point doesn't need coordinate conversion.
UIView* passThroughView = [self.visibleView hitTest:point withEvent:event];
if(passThroughView == nil)
{
// The visible view and its sub-views don't want to receive this touch
// which means it is safe for me to intercept it.
return self;
}
// The visible view wants this touch, so tell the system I don't want it.
return nil;
}
这意味着您的拦截器视图将处理长按,除非印刷机位于可见视图的交互式部分上,在这种情况下,它将允许触摸传递到可见视图及其子视图
我没有测试过这个,这只是一个想法,所以请让我知道你是如何继续下去的:)