【发布时间】:2017-07-22 16:01:19
【问题描述】:
我通过向上和向下滑动来在屏幕上和关闭屏幕上设置 UIView 的动画。我使用这段代码来做到这一点:
private var _animator: AnyObject?
@available(iOS 10.0, *)
var animator: UIViewPropertyAnimator? {
get {
return _animator as? UIViewPropertyAnimator
}
set {
_animator = newValue
}
}
var haveTheySwiped = false
var haveTheyNotSwiped = true
@available(iOS 10.0, *)
func handlePan(recognizer: UIPanGestureRecognizer) {
let vel = recognizer.velocity(in: self)
switch recognizer.state {
case .began:
if vel.y < 0 && !haveTheySwiped {
animator = UIViewPropertyAnimator(duration: 1, curve: .easeOut, animations: {
self.backgroundImage.frame = self.backgroundImage.frame.offsetBy(dx: 0, dy: -603)
})
haveTheySwiped = true
isScanVisible = true
} else if vel.y > 0 && haveTheySwiped {
animator = UIViewPropertyAnimator(duration: 1, curve: .easeOut, animations: {
self.backgroundImage.frame = self.backgroundImage.frame.offsetBy(dx: 0, dy: 603)
})
haveTheySwiped = false
isScanVisible = false
}
animator?.pauseAnimation()
print(backgroundImage.frame.origin)
case .changed:
let translation = recognizer.translation(in: backgroundImage)
if vel.y < 0 {
animator?.fractionComplete = translation.y / -603
} else if vel.y > 0 && haveTheySwiped == true {
animator?.fractionComplete = translation.y / 603
}
case .ended:
animator?.continueAnimation(withTimingParameters: nil, durationFactor: 0)
case .possible: break
default: break
}
}
但是,最近我遇到了一个错误。当我尝试拉起时,UIView 没有出现,然后当我抬起手指时,应用程序崩溃并出现以下错误:
*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“释放是错误的 暂停或停止的属性动画师。属性动画师必须要么 完成动画或显式停止并在他们可以之前完成 被释放。'
有人遇到过这个吗?希望有人帮助找出导致这种情况发生的原因。任何帮助将不胜感激。提前非常感谢!
干杯, 鞋
【问题讨论】:
-
@solenoid 非常感谢您的评论!我的功能实际上与视图相关联,而不是触发动画。你能澄清一下你在说什么吗?
-
错误基本上是在说“嘿,在我以某种方式完成回调(以适当的方式完成或取消)之前不要释放我,因为我正在另一个线程上运行”。因此,只需使用手势识别器的输入来用手指移动传入的视图。我现在不能测试它,但应该有这样的例子。
-
@solenoid 你会知道我的代码的哪一部分是这样做的吗?只是有点迷茫……哈哈哈
-
func stopAnimation(Bool) 在当前位置停止动画。必需的。 func finishAnimation(at: UIViewAnimatingPosition) 完成动画并将动画器返回到非活动状态。必需的。 - 这些可能是缺少的,对不起我的大脑放屁
-
如果您使用
pausesOnCompletion = true修复iOS 11 中的后台错误,该应用程序也会崩溃并显示相同的错误消息。如果您激活此标志,动画师将保持状态.active,即使它已完成。当系统现在尝试清理内存时,动画师必须处于状态.inactive否则应用程序将崩溃。