我尝试通过长按手势和配置为连续更新的步进器来设置视图。使用长按时,不会出现步进器的连续功能。目前,我已经禁用了longpress。我想我不需要它。但是为了将来参考,我如何允许两者共存?

为了清楚起见,这是我尝试此操作时设置屏幕的方式。


应用是使用简单的视图控制器设置的。
子视图已添加到此视图(可以是控制器,但我只是将其设为UIView)。
几个标签和步进器已添加到此子视图。
踏步机被连接为插座和动作。
在IB的主视图中添加了longpress识别器。
为了完整起见,还向IB中的主视图添加了轻击手势。


轻按主视图即可正常工作。步进器上的拍子功能正常。长按主视图,按预期功能。长按不上步进器。

我修改了longpress调用的代码,以检查子视图的框架,并且如果触摸位置在该矩形内则不执行操作,但这没有任何区别。在这种情况下,我没有尝试过让长按失败者失败,但我想接下来会尝试。编辑:好的,也许不是。似乎没有API。但是,有this kludge,我将不尝试。

随附的是探查器的屏幕快照,其中包含倒置的调用树,因此您可以查看正在调用的每个项目。

darkStepped:是步进器调用的IBAction。如果步进器是由手势识别器触发的,我是否不希望在调用树中看到手势识别器?

最佳答案

如果步进器是由手势识别器触发的,我是否不希望在调用树中看到手势识别器?


堆栈跟踪显示步进器的_updateCount方法是通过计时器分派的。

这可能与以下事实有关:步进器具有“ autoIncrement”模式,在这种模式下,只要按住它,它就会以给定的(可变)速率进行更新。因此,步进器设置了一个计时器来处理此行为,而不是简单地调用_updateCount

无论出于何种原因使用了计时器,计时器都会说明为什么您在堆栈跟踪中看不到手势识别器的原因。

在您的情况下,发生的情况是步进器获取了触摸,对其进行了处理,并且不将其转发给与之相连的任何手势识别器。

可以解释如下,尽管此代码段未明确提及与UIStepper控件有关的长按识别器:

根据Apple Docs


  与其他用户界面控件进行交互
  在iOS 6.0及更高版本中,默认控制动作可防止手势识别器行为重叠。例如,按钮的默认操作是单击。如果您在按钮的父视图上附加了一个点击手势识别器,并且用户点击了该按钮,则该按钮的操作方法将接收触摸事件,而不是手势识别器。这仅适用于与控件的默认操作重叠的手势识别,其中包括:
  
  单指单击UIButton,UISwitch,UIStepper,UISegmentedControl和UIPageControl。
  
  ...
  
  如果您具有这些控件之一的自定义子类,并且想要更改默认操作,则将手势识别器直接附加到控件而不是父视图。然后,手势识别器首先接收触摸事件。与往常一样,请务必阅读iOS人机界面指南,以确保您的应用程序提供直观的用户体验,尤其是在覆盖标准控件的默认行为时。


因此,似乎您可以将手势识别器直接附加到控件(可能需要子类UIStepper才能起作用,我不太确定如何解释最后一段)。希望这不会禁用步进器的基本功能(但也许会)。

关于ios - 如何使步进和长按并存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20847475/

10-12 04:31