如何有条件地拦截触摸事件?

6
我正在使用Swift为iOS 8编写自定义键盘扩展,但在实现Swype风格的涂鸦叠加时遇到了问题。目前,我的键盘具有一个基础的UIView(即我的UIInputViewControllerview属性),其中包含许多对应于键盘上按键的UIButtons。这些按键都响应touchUpInside事件,并具有UISwipeGestureRecognizers,当向上或向下滑动时输入次要字符。我已经重写了touchesBegan:withEvent:以将我的涂鸦叠加视图添加为子视图,并在我的UIInputViewController中使用touchesEnded:withEvent:来删除我的涂鸦叠加视图。

目前,如果我尝试从一些按钮之间的空格开始涂鸦,则涂鸦叠加视图会正确出现。但是,如果我从一个UIButton上开始涂鸦,则UIButton会捕获触摸事件并不将其转发给我的UIInputViewController

我该如何实现我的键盘,使得用户在按键之间涂鸦时出现涂鸦叠加视图,但在处理按钮按下/滑动时不出现涂鸦叠加视图?

--编辑--

我尝试通过重写touchesBegan/Moved/Ended/Cancelled方法将事件转发给下一个响应者来解决此问题。如果我单击一个按钮,然后再单击另一个按钮,我可以在两者之间显示涂鸦。但是,我仍然无法在按钮上绘制任何涂鸦,作为按钮之间的涂鸦。有人有更好的想法吗?

--编辑#2--

目前,我的视图层次结构设置如下: UIView(来自UIInputViewController) 子视图:所有按钮,然后是我的ScribbleView叠加在子视图上。

如果我在ScribbleView上设置userInteractionEnabled为true,则可以在任何位置显示涂鸦,而不管起始位置如何,但是我会失去按钮功能。

至于源代码,我一直在尝试传递触摸事件等各种配置,但主要代码可以在此处找到:https://github.com/Kamaros/ELDeveloperKeyboard

2个回答

0
我猜测一下,因为我还没有尝试过与UIInputViewControllers一起工作。但是,你可以尝试继承UIButton并重写touchesBegan:withEvent:touchesEnded:withEvent:方法,以便将这些事件转发到你的UIInputViewController中。

肯定是一个选项,虽然我不确定这将如何与我附加到每个按钮的手势识别器配合工作。如果没有人想到更聪明的方法,那么值得一试。 - Kamaros
既然你在按钮之间得到了涂鸦(而不是在按钮上),那么这不仅仅是视图层次的问题吗?我的意思是,你难道不是在按钮本身下面绘制吗?再次强调,这只是一个猜测,因为我无法访问你的代码。或者,如果你喜欢把事情搞砸,你可以在所有按钮上方放置一个空的UIView,并在其上绘制,而不是在你现在绘制的任何地方绘制。 - B.R.W.

0

我认为你需要将ScribbleView的interactionEnabled设置为YES,并将不想要的touchEvents转发到下面的按钮。例如,如果您在同一位置或轻敲中识别出长按,则知道用户想按按钮。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接