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

问题描述:

我有几个组件需要动画。我一直在使用UIVIew.animate()很长一段时间没有问题。但是在这种情况下,其中一个组件不具有动画效果(特别是pullUpViewBottomCSTR),它只是将视图“跳”到没有动画的位置(而其余的按预期工作)。动画不适用于所有视图(iOS)

你可以提供任何可能的解释(因为它可能是垃圾复制粘贴一切)。我很困惑。

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 

我后来用盘式识别器,并根据需要进行更新的约束(这可能是相关的)(这就是为什么即时通讯保持对它的引用)。

+0

尝试写self.view.layoutIfNeeded() –

+0

当前组件是一个UIView,而不是一个UIViewController 我已经尝试做到以下几点:self.pullupView.layoutIfNeeded()。似乎没有工作。我希望我不会这样做,因为我已经在superview上做self.layoutIfNeeded()。但在任何情况下,其不幸的是没有改变任何东西:/ –

+0

检查约束的初始值(应该是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() 

应该正常工作。

+0

这工作。我非常渴望了解为何如此。动画发生在UIView内部,所有涉及的子视图都包含在里面。为什么需要调用superview(在本例中是UIViewController)? 非常感谢您抽出宝贵时间,如果您能指出我正确的方向,以便我能理解为什么我正在做我在这里做的事情,我将非常感激。 再次感谢。 –

+0

我修改了答案以提供更好的解释。 – vacawama