我在一个视图中有一个图层动画方面的问题。我已经通过Google搜索了该问题,但是只找到使用
为了确保该层在总体上得到正确的大小(在初始化/加载/屏幕旋转等过程中),我被告知要这样做:
这段代码看起来完美无瑕,但我认为
难道没有更好的方法吗?
CATransaction
的答案,假设我知道其边界的fromValue
和toValue
。我有一个在点击时调整大小的tableHeader
的视图,在UIView.animate()
块中它作为一个普通的UIView
进行动画处理,效果正常。这个视图有一个CAGradientLayer
作为子层,以给它一个渐变的背景颜色。当视图动画其高度时,该层不会随之动画。该层会立即更改其边界,当动画开始时。为了确保该层在总体上得到正确的大小(在初始化/加载/屏幕旋转等过程中),我被告知要这样做:
override func layoutSubviews() {
super.layoutSubviews()
gradientLayer.frame = backgroundView.bounds
}
它每次都可以得到正确的尺寸,但从未进行过动画处理。
为了执行我的视图动画,我这样做:
self.someLabelHeightConstraint.constant = someHeight
UIView.animate(withDuration: 0.3, animations: { [weak self] in
self?.layoutIfNeeded()
})
这段代码看起来完美无瑕,但我认为
layoutIfNeeded()
在某个时刻会调用layoutSubviews
,这会破坏我添加到块中的任何CALayer动画。
正如你所见,我只改变了我的视图中设置的约束的常量,因此我实际上不知道完成动画后实际标题视图的大小将是多少。我可能可以进行一些数学计算来找出它的大小,但这似乎是不必要的。难道没有更好的方法吗?
CAShapeLayer
不起作用,因为您需要更新path
。选项包括CABasicAnimation
或CADisplayLink
驱动的动画。最简单的选择是在draw(_:)
方法中呈现边框(并使用.redraw
的contentMode
)...描边在动画中间不完美,但如果您的动画时间相当短,没有人会注意到。但是,所有这些都超出了这个问题的范围,我建议您发布自己的问题... - RobviewBackingLayer.action(forKey: "backgroundColor") as? CABasicAnimation
来获取此类操作。然后将此动画用作动画持续时间和时间函数的参考。然后为子层添加自定义动画。 - Honghao Z