在 Swift 中设置可拖动项目的限制

Emr*_*der 0 view textfield imageview ios swift

我有一个图像视图和该图像上的文本字段。我使用下面的代码使文本字段可拖动,但它可以拖动到屏幕中的任何位置。我希望该文本字段只能在图像视图的限制内拖动。如果我取消注释,如果检查 dragedView 函数,则文本字段会卡在 imageview 的左侧,因为它们的 x 值变得相同。

我找到了这个解决方案,但无法修改它以适用于我的项目。 使用 UIPanGestureRecognizer 将 UIView 拖动到有限区域内

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    let gesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.draggedView(_:)))
    bottomTextField.addGestureRecognizer(gesture)
    bottomTextField.isUserInteractionEnabled = true
}
  func userDragged(gesture: UIPanGestureRecognizer){
    let loc = gesture.location(in: self.view)
    self.bottomTextField.center = loc
}
func draggedView(_ sender:UIPanGestureRecognizer) {
    let compare = MyimageView.frame.maxX <= bottomTextField.frame.maxX
    //if(MyimageView.frame.minX <= bottomTextField.frame.minX && compare )
    // {
    self.view.bringSubview(toFront: sender.view!)
    let translation = sender.translation(in: self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    sender.setTranslation(CGPoint.zero, in: self.view)

    // }
}
Run Code Online (Sandbox Code Playgroud)

gan*_*ogo 5

主要问题是您在进行翻译之前要检查位置。这意味着文本字段最终位于无效位置,之后if永远不会到达该块。

这是解决该问题的稍微不同的方法,意味着文本字段正好到达限制的边缘:

func draggedView(_ sender: UIPanGestureRecognizer) {

  guard let senderView = sender.view else {
    return
  }

  var translation = sender.translation(in: view)

  translation.x = max(translation.x, MyimageView.frame.minX - bottomTextField.frame.minX)
  translation.x = min(translation.x, MyimageView.frame.maxX - bottomTextField.frame.maxX)

  translation.y = max(translation.y, MyimageView.frame.minY - bottomTextField.frame.minY)
  translation.y = min(translation.y, MyimageView.frame.maxY - bottomTextField.frame.maxY)

  senderView.center = CGPoint(x: senderView.center.x + translation.x, y: senderView.center.y + translation.y)
  sender.setTranslation(.zero, in: view)
  view.bringSubview(toFront: senderView)
}
Run Code Online (Sandbox Code Playgroud)

guard我还通过在顶部添加声明并删除强制展开来使其更安全。