我想要展开一个视图,以响应一个显示三角形的点击,但是动画并没有按照我想要的方式运行。

(如果gif没有循环,很抱歉。该工具本应创建循环动画,但显然没有...)
当它展开时,外部视图立即改变大小,然后内容向上动画回到适当的位置。当它折叠时,大小再次立即改变,然后内容在其中滚动。我想要的是动画大小的改变,显示/隐藏内容,而不是相对于封闭视图的左上角移动。
我的代码如下所示:
NSAnimationContext.runAnimationGroup({
context in
context.duration = 0.25
context.allowsImplicitAnimation = true
// Order is important so we don't get conflicting constraints
if newValue {
closedConstraint.isActive = false
openConstraint.isActive = true
}
else {
openConstraint.isActive = false
closedConstraint.isActive = true
}
layoutSubtreeIfNeeded()
}, completionHandler: {
self.disclosureButton.integerValue = newValue ? 1 : 0
})openConstraint将封闭视图的底部限制为最后一个字段的底部。closedConstraint将其限制在顶部的文本标签的底部,因此只有标签可见。
那么我如何a)动画封闭视图的边界,以及b)在动画过程中将内容锚定在顶部?
发布于 2018-03-20 03:40:04
我认为您的问题来自于这样一个事实:当在布局约束上设置动画时,动画将仅应用于当前视图的重新布局。
这意味着,当视图的content使用动画进行重新布局时,frame没有动画,因此会立即重新绘制。
要解决此问题,您可以尝试为superview设置动画。我不确定这将如何在这段代码中工作,但也许可以尝试在动画块中添加superview?.setNeedsLayout()和superview?.layoutIfNeeded()。
如果这不是一个完美的解决方案,我道歉,因为我在过去遇到过类似的问题,也没有找到好的解决方案。
如果有帮助,请告诉我。
https://stackoverflow.com/questions/49368965
复制相似问题