如何让步进和长时间共存?

我试图用longpress手势设置一个视图,并configuration了一个步进器来进行连续更新。 随着longpress,步进器的连续function不会发生。 现在,我已经禁用了longpress。 我想我不需要它。 但为了将来的参考,我将如何让两者共存?

只是要清楚,这是屏幕设置的方式,当我尝试了这一点。

  • 应用程序设置了一个简单的视图控制器。
  • 一个子视图被添加到这个视图(可能是一个控制器,但我只是把它作为一个UIView)。
  • 这个子视图中添加了几个标签和步进器。
  • 步进器被连接起来作为出口和行动。
  • 在IB的主视图中添加了longpress识别器。
  • 为了完整起见,还在IB的主视图中添加了轻击手势。

按预期点击主视图function。 点击步进function如预期。 对主视图的Longpress按预期运行。 对步进器的长按没有。

我修改了longpress调用的代码来检查子视图的框架,而不是在触摸位置在该矩形内时动作,但这没有什么区别。 在这种情况下,我并没有试图让长久失败,但我想我会尝试下一步。 编辑:好的,也许不是。 这似乎没有一个API。 不过,有这个混乱 ,我不会去尝试。

附加是一个从调查器的倒序调用树的屏幕截图,所以你可以看到每个项目被调用。

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

显示部分由步进器调用的步进的屏幕截图

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

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

这可能与步进器具有“自动增量”模式有关,只要按住它,它将以给定(不同的)速率更新。 所以,而不是简单地调用_updateCount ,步进器设置一个计时器来处理这种行为。

无论出于什么原因使用计时器,计时器都解释了为什么在堆栈跟踪中看不到手势识别器。

在你的情况下,发生的事情是,步进机获取触摸,处理它们,并不转发给任何附加到它的手势识别器。

这可以解释如下,虽然这个片段并没有明确提到与UIStepper控件有关的长按识别器:

根据苹果文件 :

与其他用户界面控件交互在iOS 6.0及更高版本中,默认控件操作可防止重叠的手势识别器行为。 例如,button的默认操作是单击。 如果您将一个轻击手势识别器附加到button的父视图,并且用户点击该button,则button的操作方法会接收触摸事件,而不是手势识别器。 这仅适用于与控件的默认操作重叠的手势识别,其中包括:

UIButton,UISwitch,UIStepper,UISegmentedControl和UIPageControl上的单指单击。

如果您具有这些控件之一的自定义子类,并且想要更改默认操作,请将手势识别器直接附加到控件而不是父视图。 然后,手势识别器首先接收触摸事件。 一如既往,一定要阅读iOS人机界面指南,以确保您的应用程序提供直观的用户体验,特别是在覆盖标准控件的默认行为时。

所以,看起来你可以将手势识别器直接附加到控件上(可能需要将UIStepper子类UIStepper才能工作,但我不太清楚如何解释最后一段)。 希望这不会禁用步进器的基本工作(但也许会)。

再仔细审查苹果的文档后,我find了解决办法。 我添加了视图控制器作为longpress手势识别器的代表

 self.longPress.delegate = self; 

(当然,在接口中添加<UIGestureRecognizerDelegate> ,然后将此方法添加到视图控制器中:

 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // Determine if the touch is inside the custom subview if (gestureRecognizer == self.longPress) { CGPoint touchLocation = [touch locationInView:self.view]; if (CGRectContainsPoint(self.antControl.frame, touchLocation)) { return NO; } } return YES; } 

这样,当self.antControl出现在问题中提到的子视图self.antControl的框架内时,手势识别器甚至不会被调用。