【问题标题】:Swift drag subview to delete on certain position快速拖动子视图以在特定位置删除
【发布时间】:2017-07-05 22:58:59
【问题描述】:

我正在尝试找出一种在到达某个位置时拖动和删除子视图的方法。到目前为止,我拥有的是一个视图控制器,我在其上添加了几个子视图。我的子视图类是可旋转和可调整大小的,我可以在视图控制器上移动它们。假设我想在视图控制器的顶部中心移动一个子视图并将其删除。我的父视图控制器如何知道子视图的位置并执行删除? 另一个问题是所有子视图都是从同一个自定义类生成的。我应该如何定义应该删除哪个子视图? 提前谢谢你。

【问题讨论】:

  • 检查this,这是我复制的WWDC演示,这可能会对你有所帮助。
  • 谢谢你,这真的很有帮助。我会试试的。

标签: ios swift uiview subview


【解决方案1】:

您可以使用 UIPanGestureRecognizer 移动视图并使用CGRect.intersects 来查看新位置是否会将您带入删除区域(如果您想要求您完全位于删除区域内,请使用 contains):

    @IBAction func pan(_ recognizer: UIPanGestureRecognizer) {
        let translation = recognizer.translation(in: self.view)
        centerXConstraint.constant += translation.x
        centerYConstraint.constant += translation.y
        viewToMove.offset.x += translation.x
        viewToMove.offset.y += translation.y
        if viewToMove.frame.intersects(deletionRect) {
            //Delete logic here
        } else {
            viewToMove.setNeedsDisplay()
            recognizer.setTranslation(.zero, in: self.view)
        }

    }

如果您有多个视图,您可以使用 UIView.tag 或 Set 来确定哪个视图是哪个。

【讨论】:

  • 感谢您的建议。这个手势应该在子视图或控制器上实现。因为我在子视图类上使用了 UIPanGestureRecognizer。
  • 其实我还是会在 viewController 上实现它并使用视图数组。在这种情况下,您将平移手势识别器放在主视图上,并在识别的手势开始时检查数组 views.first {$0.frame.contains(point)} 以获取第一次触摸的视图。这样你就不需要子类和协议了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 2018-06-06
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
相关资源
最近更新 更多