如何为平移手势设置 y 轴的限制?
How do I set limits in the y-axis for a Pan Gesture?
我想将图像视图限制为特定的 y 坐标,但每次我将它拖动到 2 坐标上方或下方时,视图都会卡住并且不再移动。此外,如果我拖动得足够快,imageView 会高于或低于我限制的坐标。
@IBAction func handlePan(_ gesture: UIPanGestureRecognizer) {
// 1
let translation = gesture.translation(in: view)
// 2
guard let gestureView = gesture.view else {
return
}
if gestureView.center.y >= 161 && gestureView.center.y <= 561 {
gestureView.center.y = gestureView.center.y + translation.y
gesture.setTranslation(.zero, in: view)
}
// 3
gesture.setTranslation(.zero, in: view)
}
当图像视图的 y 坐标超出指定范围时,与其完全不移动图像视图,不如让图像视图在太高时向下移动,如果太低则向上移动.
指定在哪些情况下您不想移动图像视图会更容易:
- y < 161 并向上平移
- y > 561 并向下平移
另外,之所以可以通过快速拖动将其移出有效的y范围,是因为您只在移动之前检查图像视图的y坐标是否在范围内,而在移动之后则不会。您应该在添加 translation.y
.
时改为 值
@IBAction func handlePan(_ gesture: UIPanGestureRecognizer) {
// 1
let translation = gesture.translation(in: view)
// 2
guard let gestureView = gesture.view else {
return
}
// in these two cases, don't translate the image view
if (gestureView.center.y < 161 && translation.y < 0) ||
(gestureView.center.y > 561 && translation.y > 0) {
gesture.setTranslation(.zero, in: view)
return
}
// clamping the translated y
gestureView.center.y = min(max(gestureView.center.y + translation.y, 161), 561)
gesture.setTranslation(.zero, in: view)
}
我想将图像视图限制为特定的 y 坐标,但每次我将它拖动到 2 坐标上方或下方时,视图都会卡住并且不再移动。此外,如果我拖动得足够快,imageView 会高于或低于我限制的坐标。
@IBAction func handlePan(_ gesture: UIPanGestureRecognizer) {
// 1
let translation = gesture.translation(in: view)
// 2
guard let gestureView = gesture.view else {
return
}
if gestureView.center.y >= 161 && gestureView.center.y <= 561 {
gestureView.center.y = gestureView.center.y + translation.y
gesture.setTranslation(.zero, in: view)
}
// 3
gesture.setTranslation(.zero, in: view)
}
当图像视图的 y 坐标超出指定范围时,与其完全不移动图像视图,不如让图像视图在太高时向下移动,如果太低则向上移动.
指定在哪些情况下您不想移动图像视图会更容易:
- y < 161 并向上平移
- y > 561 并向下平移
另外,之所以可以通过快速拖动将其移出有效的y范围,是因为您只在移动之前检查图像视图的y坐标是否在范围内,而在移动之后则不会。您应该在添加 translation.y
.
@IBAction func handlePan(_ gesture: UIPanGestureRecognizer) {
// 1
let translation = gesture.translation(in: view)
// 2
guard let gestureView = gesture.view else {
return
}
// in these two cases, don't translate the image view
if (gestureView.center.y < 161 && translation.y < 0) ||
(gestureView.center.y > 561 && translation.y > 0) {
gesture.setTranslation(.zero, in: view)
return
}
// clamping the translated y
gestureView.center.y = min(max(gestureView.center.y + translation.y, 161), 561)
gesture.setTranslation(.zero, in: view)
}