立即调用 Pan Gesture 完成处理程序
Pan Gesture completion handler getting called immediately
我正在为视图设置动画以在用户平移屏幕时移动。我保留了一个阈值,在该阈值之后视图将动画到默认位置。
目前的问题是在持续时间之前调用了将视图重置到某个位置的动画方法的完成处理程序。动画似乎是突然发生的,而不是持续一段时间。
// Pan gesture selector method
@objc func panAction(for panGesture: UIPanGestureRecognizer) {
switch panGesture.state {
case .began:
//Began code
case changed:
if (condition) {
print("IF")
//Change constraint constant of customView
animate(view: customView)
} else if (condition) {
print("ELSE IF")
//Change constraint constant of customView
animate(view: customView)
} else {
//Change constraint constant of customView
print("ELSE")
view.layoutIfNeeded()
}
case .ended:
//Ended code
default:
break
}
}
动画方法:
func animate(view: UIView) {
UIView.animate(withDuration: 3, delay: 0, options: .curveEaseOut, animations: {
view.layoutIfNeeded()
}, completion: { (finished) in
if finished {
flag = false
}
})
}
正在立即设置标志,而不是在 3 秒后设置。
我在平移和越过阈值时得到的 o/p。
其他
其他
其他
其他
如果
编辑:我是个白痴。我没有在 superView 上调用 layoutIfNeeded()
。
您的手势在手势发生时会发送多个事件,并且当您多次调用 UIView.animate() 代码时,新值会取代前一个值。
尝试添加动画选项.beginFromCurrentState
:
UIView.animate(withDuration: 0.5, delay: 0, options: [.beginFromCurrentState,.allowAnimatedContent,.allowUserInteraction], animations: {
view.layoutIfNeeded()
}) { (completed) in
...
}
并期望随着手势的进行,您的 completed 会被多次调用,并且 completed == false。
编辑:您的问题也可能与在错误的视图上调用 layoutIfNeeded() 有关,可能尝试在 viewController.view ?
上调用它
我解决了这个问题。我没有在超级视图上调用 layoutIfNeeded
。
我正在为视图设置动画以在用户平移屏幕时移动。我保留了一个阈值,在该阈值之后视图将动画到默认位置。
目前的问题是在持续时间之前调用了将视图重置到某个位置的动画方法的完成处理程序。动画似乎是突然发生的,而不是持续一段时间。
// Pan gesture selector method
@objc func panAction(for panGesture: UIPanGestureRecognizer) {
switch panGesture.state {
case .began:
//Began code
case changed:
if (condition) {
print("IF")
//Change constraint constant of customView
animate(view: customView)
} else if (condition) {
print("ELSE IF")
//Change constraint constant of customView
animate(view: customView)
} else {
//Change constraint constant of customView
print("ELSE")
view.layoutIfNeeded()
}
case .ended:
//Ended code
default:
break
}
}
动画方法:
func animate(view: UIView) {
UIView.animate(withDuration: 3, delay: 0, options: .curveEaseOut, animations: {
view.layoutIfNeeded()
}, completion: { (finished) in
if finished {
flag = false
}
})
}
正在立即设置标志,而不是在 3 秒后设置。
我在平移和越过阈值时得到的 o/p。
其他
其他
其他
其他
如果
编辑:我是个白痴。我没有在 superView 上调用 layoutIfNeeded()
。
您的手势在手势发生时会发送多个事件,并且当您多次调用 UIView.animate() 代码时,新值会取代前一个值。
尝试添加动画选项.beginFromCurrentState
:
UIView.animate(withDuration: 0.5, delay: 0, options: [.beginFromCurrentState,.allowAnimatedContent,.allowUserInteraction], animations: {
view.layoutIfNeeded()
}) { (completed) in
...
}
并期望随着手势的进行,您的 completed 会被多次调用,并且 completed == false。
编辑:您的问题也可能与在错误的视图上调用 layoutIfNeeded() 有关,可能尝试在 viewController.view ?
上调用它我解决了这个问题。我没有在超级视图上调用 layoutIfNeeded
。