gpt4 book ai didi

ios - 自定义 UIGestureRecognizer 未按预期工作

转载 作者:行者123 更新时间:2023-11-29 05:02:47 41 4
gpt4 key购买 nike

我有一个 UITableView,我将其呈现在 UIPopoverController 中。表格 View 显示了可以拖放到主视图上的元素列表。

当用户开始主要是垂直的平移手势时,我希望 UITableView 像往常一样滚动。当它一开始主要不是垂直的时,我希望应用程序将其解释为拖放操作。

不幸的是,我在这条路上经历了漫长的旅程,迫使我创建一个自定义的UIGestureRecognizer。为了掌握正确的基础知识,我一开始将这个自定义手势保留为空实现,它仅调用 Apple 认为应该覆盖的五个自定义方法中每一个的 super 版本:

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
(void)reset;

这不会导致任何事情发生,即永远不会调用自定义手势的操作方法,并且表格 View 照常滚动。

在下一个实验中,我在 touchesBegan 方法中将手势状态设置为 UIGestureRecognizerStateBegan

这会导致触发手势的操作方法,使手势看起来就像标准的 UIPanGestureRecognizer 一样。这显然表明我负责管理手势的状态。

接下来,我在 touchesMoved 方法中将手势状态设置为 UIGestureRecognizerStateChanged。一切都还好。

现在,我尝试在 touchesMoved 方法中将手势状态设置为 UIGestureRecognizerStateFailed。我原以为这会终止手势并将事件流恢复到 TableView ,但事实并非如此。它所做的只是停止触发手势的操作方法。

最后,在将手势状态设置为 UIGestureRecognizerStateBegan 后,我立即在 touchesBegan 方法中将其状态设置为 UIGestureRecognizerStateFailed

这会导致手势仅触发其操作方法一次,然后将所有后续事件传递到 TableView 。

所以...抱歉问了这么长的问题...但是为什么,如果我在 touchesBegan 方法中导致手势失败(在首先将状态设置为 UIGestureRecognizerStateBegan 之后) code>),它是否按预期将事件重定向到 TableView 。但是,如果我在 touchesMoved 中尝试相同的技术(我唯一能检测到移动主要是垂直的地方),为什么不会发生这种重定向?

最佳答案

抱歉让事情变得比实际情况更复杂。经过大量阅读和测试,我终于弄清楚了如何做到这一点。

首先,创建自定义 UIGestureRecognizer是这个问题的正确解决方案之一,但是当我第一次测试空的自定义识别器时,我犯了一个菜鸟错误:我忘记打电话 [super touches...:touches withEvent:event]对于我重写的每个方法。这导致什么也没有发生,所以我将识别器的状态设置为 UIGestureRecognizerStateBegantouchesBegan ,这确实导致操作方法被调用一次,从而使我相信我必须显式管理状态,这只是部分正确。

事实上,如果您创建一个空的自定义识别器并在您覆盖的每个方法中调用适当的 super 方法,您的程序将按预期运行。在这种情况下,将在整个拖动 Action 中调用操作方法。如果,在 touchesMoved ,您将识别器的状态设置为 UIGestureRecognizerStateFailed ,事件将冒泡到 super View (在本例中为 UITableView ),也如预期。

我犯的错误以及我认为其他人可能犯的错误是认为当您对手势识别器进行子类化时(即 touchesBegantouchesMoved 等),设置手势状态和标准方法的时间顺序之间存在直接关联。 )。不存在——至少,它不是一个精确的映射。你最好让基本行为保持原样,只在必要时进行干预。因此,就我而言,一旦确定用户的拖动主要是垂直的,我只能在 touchesMoved 中执行此操作。 ,我将手势识别器的状态设置为 UIGestureRecognizerStateFailed在那个方法中。这将识别器从图片中移除,并自动将全套事件转发到包围 View 。

为了简洁起见,我省略了通过本次练习学到的大量其他内容,但想指出的是,在有关该主题的六七本书中,Matt Neuburg 的《Programming IOS 4》提供了最好的到目前为止对这个主题的解释。我希望本网站允许推荐。我与作者或出版商没有任何关系 - 只是感谢您的出色解释!

关于ios - 自定义 UIGestureRecognizer 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6484985/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com