Animate intrinsicContentSize更改

Loz*_*Loz 48 cocoa-touch uiview nslayoutconstraint

我有一个UIView子类绘制一个半径变化的圆(具有漂亮的弹性动画).视图决定了圆的大小.

我希望这个UIView子类更改其帧大小以匹配圆半径的动画更改,并且我希望这些更改可以修改连接到视图的任何NSLayoutConstraints(以便限制到圆的边缘的视图将移动为圈调整大小).

我理解半径更改时实现-(CGSize)intrinsicContentSize和调用invalidateIntrinsicContentSize将告诉约束更新,但我无法弄清楚如何动画更改intrinsicContentSize.

invalidateIntrinsicContentSize从[UIView animateWith ...块]中调用只是立即更新布局.

这是否可能,是否有解决方法/更好的方法?

sti*_*igi 60

invalidateIntrinsicContentSize适用于动画和layoutIfNeeded.您唯一需要考虑的是,更改内在内容大小会使superview的布局无效.所以这应该工作:

[UIView animateWithDuration:0.2 animations:^{
    [self invalidateIntrinsicContentSize];
    [self.superview setNeedsLayout];
    [self.superview layoutIfNeeded];
}];
Run Code Online (Sandbox Code Playgroud)

  • 好的,如果您在中间添加[self.superview setNeedsLayout]行,则有效 (9认同)

nat*_*ter 8

对我有用的@stigi 答案的Swift版本:

UIView.animate(withDuration: 0.2, animations: {
    self.invalidateIntrinsicContentSize()
    self.superview?.setNeedsLayout()
    self.superview?.layoutIfNeeded()
})
Run Code Online (Sandbox Code Playgroud)