动画不适用于所有视图 (iOS)

Animation doesnt work for all views (iOS)

我有一些组件需要制作动画。我已经使用 UIVIew.animate() 很长时间了,没有任何问题。但是在这种情况下,其中一个组件没有动画(具体来说 pullUpViewBottomCSTR),它只是 "jumps" 视图到位而没有动画(而其余组件按预期工作)。

您能否对此提供任何可能的解释(因为复制粘贴所有内容可能是垃圾邮件)。我很困惑。

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
            //
        }
  1. 我不认为我有任何冲突的约束。

  2. 此代码驻留在 UIView 组件中,而不是 UIViewController

  3. 我正在 viewController 中加载此组件。我曾经把整个东西都放在 UIViewController 中,我认为它曾经正常工作,直到我将它移动到相应的 .xib 和 .swift 文件。

更新:

原先添加的约束如下。 (这可能是相关的)

   self.pullUpViewBottomCSTR =  parentController.view.bottomAnchor.constraint(equalTo: self.bottomAnchor)
   self.pullUpViewBottomCSTR!.isActive = true;
   self.pullUpViewBottomCSTR!.constant = 0

稍后我将使用 pan 识别器并根据需要更新约束(这就是我保留对它的引用的原因)。

您绑定到动画的视图是 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()

应该也可以。