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)
主要问题是您在进行翻译之前要检查位置。这意味着文本字段最终位于无效位置,之后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我还通过在顶部添加声明并删除强制展开来使其更安全。