我有代码为视图设置动画(更改约束)
UIView .animate(withDuration: TimeInterval(duration), delay: 0.0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
self.topConstraint!.constant = self.yPositioOfOpenPanel
self.superview?.layoutIfNeeded()
}
奇怪的行为是在iPhone X layoutSubviews
被调用,但在其他模拟器和真实设备上没有。 (而且我认为应该是这样)
当我手动更改约束时,行为相同
if let constraint = topConstraint {
constraint.constant = self.superview!.frame.height - recogniser.location(in: self.superview).y + yPositionOfBeginTouchInPanel
}
正如所建议我添加一些新信息。
动画效果很好,一切都是动画应有的。
问题是我想在动画到位时触发一些新事件。 (我会使用topConstraint.constant在动画到位时计算某些东西,或者当我手动更改topConstraint时)这就是为什么我想在方法layoutSubviews
上设置一些触发器。当动画更改子视图时,应触发此方法。
我认为这在iOS 11之前有效(但我不能100%肯定,因为这个功能在我的程序中是新的,但我记得我在其他程序中使用它并且它有效)。它仍适用于iPhone X(模拟器),但不适用于其他模拟器或真实设备(显然真正的iPhone X还没有出现)。
答案 0 :(得分:1)
我认为您应该稍微更改动画代码:
// update constraints before you call animate
self.topConstraint!.constant = self.yPositioOfOpenPanel
// tell superview that the layout will need to be updated
self.superview?.setNeedsLayout()
UIView.animate(withDuration: TimeInterval(duration), delay: 0.0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
// here you tell it to update the layout according to new constraints
self.superview?.layoutIfNeeded()
}
答案 1 :(得分:0)
事实证明我需要做的是:
UIView .animate(withDuration: TimeInterval(duration), delay: 0.0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
self.topConstraint!.constant = self.originalConstraintConstant
self.superview?.layoutIfNeeded()
self.layoutIfNeeded()
}
这会在此视图中触发layoutIfNeeded
。
但我仍然不知道为什么这适用于所有iPhone,其他只适用于iPhone X.它应该是iOS或Xcode中的错误。