touches在约束范围内移动?

touchesMoved within restraints?

我看到我正在屏幕上拖动。我的 touches began/moved/ended 代码一直有效,直到我试图让视图不比开始时更高。

最终目标效果是我希望用户能够将 UIImageView 拖到文本视图上方的文本视图上方 100 像素处,一旦调用了“touchesEnded”如果用户将它放在文本字段上,它将动画回到其原始位置和 运行 适当的代码。

理论上我知道如何编写所有这些代码,但我无法让实际动作发挥作用。

为了防止视野比起点高,我尝试了:

 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let position = touch.location(in: self.superview)
        if position.y >= originalY // calculated in touches began with  originalY = self.center.x  {
        self.center = CGPoint(x: originalX, y: position.y)

}

但这会在我单击并向下拖动时产生一些奇怪的副作用。视图停留在原处,直到视图向下经过我的文本字段/屏幕顶部附近的其他按钮后,它才会捕捉到我的位置并开始上下滚动。

任何想法如何只让我的观点是 Y 在没有所有这些奇怪行为的情况下向上移动到它开始的地方和向下移动到某个点?

编辑:

我摆脱了对 Y 的 if 检查,并且拖动按预期工作,但是一旦我将它降到顶部的 textfield/buttons 区域下方,当我做我的 touchesEnding 并重置我的 X 时Y 回到顶部,我的视图停在 textfield/buttons 下方。所以看起来由于某种原因我的视图被挂在屏幕上的其他元素上。

两件事:

反转y

请注意,y0view 的顶部,height 在底部。在对 y 进行约束时考虑到这一点。在 touchesDidMove: 处打印 position 以获得更多见解。

子视图

其他 subviews 可能会偷走您的 touchEvents。实施 touchesCancelled(with:) 以获得更多洞察力,并确保您的可移动视图位于其他 views

的前面

如果其他 subviews 占用 touchEvents,当触摸 returns 到您的 view 时,它将再次触发 touchesBegan(with:),并抵消您的 origin