在改变内在大小

时间:2016-07-29 05:43:50

标签: ios swift nslayoutconstraint

我试图在UIView子类中编排一些动画,这些动画需要更改视图的内在大小。

CATransaction完成版块中,我调用invalidateIntrinsicContentSize()来反映尺寸的变化,并在我为约束设置动画后立即。

self.layoutIfNeeded()
UIView.animateWithDuration(2) {
  NSLayoutConstraint.deactivateConstraints(oldConstraints)
  NSLayoutConstraint.activateConstraints(newConstraints)
  self.layoutIfNeeded()
}

但是一件奇怪的事情发生了,除了提供给deactivateConstraintsactivateConstraints方法的约束外,我还看到视图的大小在相同的持续时间内被动画化。

以下是有关此内容的视频。

https://www.youtube.com/watch?v=OgM378Wryd0

这是问题图。

enter image description here

我的目的是立即更改视图的大小,而不是将其与定位约束一起设置动画。

1 个答案:

答案 0 :(得分:1)

最终工作的一个解决方案是将初始layoutIfNeeded()调用包装在动画块中,然后在完成时启动位置动画。

UIView.animateWithDuration(2, animations: { self.layoutIfNeeded() }) {
  UIView.animateWithDuration(2) {
    NSLayoutConstraint.deactivateConstraints(oldConstraints)
    NSLayoutConstraint.activateConstraints(newConstraints)
    self.layoutIfNeeded()
  }
}

它看起来并不漂亮,因为我实际上并没有动画尺寸变化,我希望它们能够立即发生。所以我仍然在寻找一个优雅的解决方案,或者为什么不能成为一个解决方案。