我有一些组件,我需要动画。我已经使用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

它被添加到selfparentController.view的最早公共祖先的约束中(如果其中一个视图是另一个视图的直接后代,则可能是其中一个视图)。为了使该约束具有动画效果,需要对最早的公共祖先调用layoutIfNeeded()
您尚未显示由self表示的视图与parentController.view的关系,但假设它是该视图的subview,则可以使用以下动画设置它:
self.superview?.layoutIfNeeded()

在动画循环内。
或者:
parentController.view.layoutIfNeeded()

也应该有用。

10-07 19:27
查看更多