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

时间:2017-09-04 10:04:01

标签: ios swift uiview autolayout nslayoutconstraint

我有一些我需要制作动画的组件。我已经使用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
            //
        }
  1. 我认为我没有任何相互矛盾的约束。

  2. 此代码位于UIView组件中,而不是UIViewController

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

  4. 更新

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

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

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

1 个答案:

答案 0 :(得分:2)

您要制作动画的视图为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()

应该也可以。