我想限制 UITextView 可以移动到另一个视图的框架的区域。我尝试使用以下代码完成此操作,但是,它不会正确限制用户可以拖动 UITextView 的位置:
@IBOutlet weak var canvas: UIView!
@IBAction func handleDragOfCaption(_ sender: UIPanGestureRecognizer) {
if sender.state == .began || sender.state == .changed {
guard let senderView = sender.view else {return}
let translation = sender.translation(in: sender.view)
let x = senderView.center.x + translation.x
let y = senderView.center.y + translation.y
let point = CGPoint(x: x, y: y)
if canvas.frame.contains(point) {
senderView.center = point
sender.setTranslation(CGPoint.zero, in: senderView)
}
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅下图以直观地表示我要完成的工作。我只希望用户能够在 UIView(这是 UITextView 下方的白色方块)的边界内拖动 UITextView。任何帮助,将不胜感激。
这是另一种方法,使用约束...
给你的“可拖动视图”(你的文本视图,在这种情况下)一个宽度约束并禁用滚动(这将允许它自动调整其高度)。
将所有四个边的“可拖动视图”约束为零 - 然后将这些约束编辑为>= 0. 这将防止视图被拖到其父视图之外。
也限制了“可拖动的意见”中心水平和垂直-然后编辑这些限制有Priority = 750。通过将中心约束设置为比边缘约束更低的优先级,只有当边缘完全在父视图内时,中心才会生效。
将中心约束连接到IBOutlet视图控制器中的 s,并vars为中心约束添加“当前”常量值。
现在将平移手势识别器添加到“可拖动视图”。
启动平移时,将中心约束常量保存到“当前”变量。
平移时,获取平移 X 和 Y(从平移起点移动的距离),并根据开始值和新值之间的差异更新中心常数。这会将“可拖动视图”移动到新位置。
完成平移后,根据“可拖动视图”的最终位置更新中心常量。
@IBAction func handleDragOfCaption(_ sender: UIPanGestureRecognizer) {
guard let senderView = sender.view else { return }
guard let parentView = senderView.superview else { return }
// get the current pan movement - relative to the view (the text view, in this case)
let translation = sender.translation(in: canvas)
switch sender.state {
case .began:
// save the current Center X and Y constants
currentCenterXConstant = textViewCenterXConstraint.constant
currentCenterYConstant = textViewCenterYConstraint.constant
break
case .changed:
// update the Center X and Y constants
textViewCenterXConstraint.constant = currentCenterXConstant + translation.x
textViewCenterYConstraint.constant = currentCenterYConstant + translation.y
break
case .ended, .cancelled:
// update the Center X and Y constants based on the final position of the dragged view
textViewCenterXConstraint.constant = senderView.center.x - parentView.frame.size.width / 2.0
textViewCenterYConstraint.constant = senderView.center.y - parentView.frame.size.height / 2.0
break
default:
break
}
}
Run Code Online (Sandbox Code Playgroud)
为了帮助正确设置约束,我在这里发布了一个示例项目:https : //github.com/DonMag/LimitDrag
| 归档时间: |
|
| 查看次数: |
1419 次 |
| 最近记录: |