ios - 未调用 UIControl endTrackingWithTouch

标签 ios uicontrol

我有一个带有点击手势识别器的 View 。此 View 的 subview 是我的自定义类的一个实例,它继承自 UIControl。我遇到一个问题,即 UIControl 子类有时会允许触摸事件在不应该传递给父 View 时传递给父 View 。

在 UIControl 子类中,我重写了这些函数(代码在 Swift 中)

override func beginTrackingWithTouch(touch: UITouch, withEvent event: UIEvent) -> Bool
{
    return true
}

override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent) -> Bool
{
    // The code here moves this UIControl so its center is at the touchpoint
    return true
}

override func endTrackingWithTouch(touch: UITouch,withEvent event: UIEvent)
{
    // Something important happens here!
}

如果用户在 UIControl 中向下触摸,在 X 和 Y 方向上拖动控件,然后离开屏幕,则此系统工作正常。在这种情况下,所有这三个函数都会被调用,并且“重要的事情”发生了。

但是,如果用户按下 UIControl,沿 X 方向拖动控件,然后离开屏幕,我们就会遇到问题。前两个函数被调用,但是当触摸点离开屏幕时,点击手势识别器被调用,endTrackingWithTouch 没有被调用。

如何确保始终调用 endTrackingWithTouch?

最佳答案

我以一种我认为是 hack 的方式解决了这个问题,但考虑到 UIGestureRecognizer 的工作方式,真的别无选择。

发生的事情是点击手势识别器正在取消控件的跟踪并注册点击手势。这是因为当我水平拖动时,我恰好拖动了很短的距离,这被解释为点击手势。

当 UIControl 正在跟踪时,必须禁用点击手势识别器:

override func beginTrackingWithTouch(touch: UITouch, withEvent event: UIEvent) -> Bool
{
    pointerToSuperview.pauseGestureRecognizer()
    return true
}

override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent) -> Bool
{
    // The code here moves this UIControl so its center is at the touchpoint
    return true
}

override func endTrackingWithTouch(touch: UITouch,withEvent event: UIEvent)
{
    // Something important happens here!
    pointerToSuperview.resumeGestureRecognizer()
}

override func cancelTrackingWithEvent(event: UIEvent?)
{
    pointerToSuperview.resumeGestureRecognizer()
}

在父 View 的类中:

pauseGestureRecognizer()
{
    tapGestureRecognizer.enabled = false
}

resumeGestureRecognizer()
{
    tapGestureRecognizer.enabled = true
}

这是可行的,因为我没有处理多点触控(我可以在使用 UIControl 跟踪触摸时不接收点击触摸事件)。

理想情况下,控件不必告诉 View 暂停手势识别器——手势识别器一开始就不应干预控件的触摸!但是,即使将手势识别器的 cancelsTouchesInView 设置为 false 也无法阻止这种情况。

关于ios - 未调用 UIControl endTrackingWithTouch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25939178/

相关文章:

ios - 当用户点击不同的文本字段时,关闭 pickerView 并打开相应的 pickerView

ios - UIKeyboardWillShowNotification & UIKeyboardDidShowNotification 报错键盘高度

iphone - UIControl(添加目标:action:forControlEvents:) @selector arguments

ios - 在没有用户交互的情况下使用 UISlider

ios - UIBarButtonItem 在显示两次后不触发选择器

ios - 为什么我的 Google map 应用程序不打印出点击的坐标?

iphone - 无法在 didSelectRowAtIndexPath 中隐藏自定义复选标记

ios - 将 UIButtonTypeDetailDisclosure 添加到 toolbarItems 导致运行时错误

iOS 7 - 如何拖动按钮或 UIView 的快照而不是按钮本身

ios - UITableViewCell setHighlighted 内的 UIButton 未在表格滚动上更新