从滚动视图中拖出项目

时间:2017-11-07 15:25:44

标签: ios swift uiscrollview

我是否在正确的路径上尝试从UIScrollView拖动项目并将其放在第二个UIScrollView上? UIScrollViews最终都不会被更改,但是我希望图像跟随touchMoved位置,直到它通过第二个UIScrollView发布。

我已经扩展了UIScrollView,因此我可以看到UIScrollView内部的触摸开始。

extension UIScrollView {
override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.next?.touchesBegan(touches, with: event)
    print("touchesBegan")
    }
}

获取被触摸的对象

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    if let touch = touches.first {
        beginningLocation = touch.location(in: self.view)
        let position = touch.location(in: itemScrollview)
        print("itemScrollview: \(position)")

        let whoHit = Int(position.x / 120)
        print("whoHit: \(whoHit) \(GameData.items[whoHit].name)")
    }
}

我尝试使用touchesEnded来查看用户是否已向上拖动,但触摸已降低并且始终无法调用。如果触摸在同一个UIScrollView上开始和结束,则可以正常工作,但是当拖动时,touchesEnd不会被调用。

1 个答案:

答案 0 :(得分:0)

哟不能“直接”将对象(视图,图像视图,标签,按钮等)从一个视图拖动到另一个视图(无论是UIView还是UIScrollView或任何其他容器)。

相反,您需要将要拖动的对象从包含视图“移动”到超级视图(“主”视图),将其作为主视图的子视图拖动,然后检查它的位置释放。

所以,基本上,如果你想拖动UIImageView:

  • 在第一次触摸时,将图像视图从其包含视图移动到“主视图”
  • 翻译坐标,因此它们现在相对于“主视图”
  • 跟踪主视图坐标中的触摸/拖动,随时重新定位图像视图
  • 发布时,查看最终触摸是否在“目标”容器视图中
  • 如果是这样,请将图像视图添加为目标视图的子视图(平移位置坐标)
  • 如果它不在目标框架内,则将其添加回原始容器,或将其放入主视图中,或将其蒸发,或任何您想要的内容。