动画不适用于所有视图(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
//
}
我不认为我有到位的任何冲突的约束。
此代码位于
UIView
组件中,而不是UIViewController
。我将这个组件加载到viewController中。我曾经在UIViewController中拥有所有的东西,我认为它一直正常工作,直到我将它移动到相应的.xib和.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()
应该正常工作。
这工作。我非常渴望了解为何如此。动画发生在UIView内部,所有涉及的子视图都包含在里面。为什么需要调用superview(在本例中是UIViewController)? 非常感谢您抽出宝贵时间,如果您能指出我正确的方向,以便我能理解为什么我正在做我在这里做的事情,我将非常感激。 再次感谢。 –
我修改了答案以提供更好的解释。 – vacawama
尝试写self.view.layoutIfNeeded() –
当前组件是一个UIView,而不是一个UIViewController 我已经尝试做到以下几点:self.pullupView.layoutIfNeeded()。似乎没有工作。我希望我不会这样做,因为我已经在superview上做self.layoutIfNeeded()。但在任何情况下,其不幸的是没有改变任何东西:/ –
检查约束的初始值(应该是0) –