我有一些组件,我需要动画。我已经使用UIVIew.animate()
很长时间了,没有问题。但是,在这种情况下,其中一个组件没有动画(特别是pullUpViewBottomCSTR
),它只是“跳转”视图到没有动画的位置(而其余的则按预期工作)。
你能对此提供任何可能的解释吗(因为复制粘贴所有内容可能会很垃圾)。我很困惑。
UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseOut, animations: {
self.pullUpViewBottomCSTR!.constant = 0
self.mainImagePullUpBottomCSTR.constant = 0
self.obscuringFadeEffectView.alpha = 0;
self.layoutIfNeeded()
}) { (completed) in
//
}
我认为我没有任何冲突的约束。
此代码位于
UIView
组件中,而不是UIViewController
组件中。我正在视图控制器中加载此组件。我以前把整个东西都放在UIViewController里面,我认为它一直正常工作,直到我把它移到相应的.XB和.SWIFT文件。
更新:
约束最初添加如下。(这可能是相关的)
self.pullUpViewBottomCSTR = parentController.view.bottomAnchor.constraint(equalTo: self.bottomAnchor)
self.pullUpViewBottomCSTR!.isActive = true;
self.pullUpViewBottomCSTR!.constant = 0
我稍后将使用一个泛识别器,并根据需要更新约束(这就是为什么我会保留对它的引用)。
最佳答案
要绑定到动画的视图self
,但其垂直位置受此约束控制:
self.pullUpViewBottomCSTR = parentController.view.bottomAnchor.constraint(equalTo: self.bottomAnchor)
使用以下命令激活此约束时:
self.pullUpViewBottomCSTR!.isActive = true
它被添加到
self
和parentController.view
的最早公共祖先的约束中(如果其中一个视图是另一个视图的直接后代,则可能是其中一个视图)。为了使该约束具有动画效果,需要对最早的公共祖先调用layoutIfNeeded()
。您尚未显示由
self
表示的视图与parentController.view
的关系,但假设它是该视图的subview
,则可以使用以下动画设置它:self.superview?.layoutIfNeeded()
在动画循环内。
或者:
parentController.view.layoutIfNeeded()
也应该有用。