UITableviewCell 中的渐变添加导致重新加载时出现动画问题
Gradient addition in UITableviewCell causing animation issue on reloading
我想做聊天画面,聊天气泡有一些渐变。将渐变应用到 UIView
时会在重新加载时产生问题。
GradientView 已被设置为 UIView 的 class,位于 UITableViewCell
class GradientView: UIView {
let gradientLayer = CAGradientLayer()
func setup() {
layer.addSublayer(gradientLayer)
}
func configure() {
gradientLayer.frame = self.bounds
gradientLayer.colors = [RGBA(r: 167, g: 1, b: 88, a: 1.0).cgColor, RGBA(r: 243, g: 135, b: 32, a: 1.0).cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 1, y: 0)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
override func layoutSubviews() {
super.layoutSubviews()
setup()
configure()
}
}
问题是在重新加载 table 视图时,渐变显示动画。
layoutSubviews
被调用多次
class GradientView: UIView {
var gradientLayer:CAGradientLayer!
func setup() {
gradientLayer = CAGradientLayer()
layer.addSublayer(gradientLayer)
gradientLayer.frame = self.bounds
gradientLayer.colors = [RGBA(r: 167, g: 1, b: 88, a: 1.0).cgColor, RGBA(r: 243, g: 135, b: 32, a: 1.0).cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 1, y: 0)
}
override func layoutSubviews() {
super.layoutSubviews()
if gradientLayer == nil {
setup()
}
}
}
您在 CALayer
及其子类上设置的许多属性将默认设置动画。对于渐变图层,这包括边界、渐变颜色以及起点和终点,所有这些都在此处设置。
这称为隐式动画。
您可以通过创建事务、禁用操作、执行更改然后提交事务来关闭它:
CATransaction.begin()
CATransaction.setDisableActions(true)
// Do your stuff
CATransaction.commit()
但是,这可能会有点混乱。另一种方法是创建一个非动画层子类并使用它代替 CAGradientLayer
:
class NonAnimatingGradientLayer: CAGradientLayer {
override func action(forKey event: String) -> CAAction? {
return NSNull()
}
}
使用这个代替 CAGradientLayer
并且没有任何动画。
我想做聊天画面,聊天气泡有一些渐变。将渐变应用到 UIView
时会在重新加载时产生问题。
GradientView 已被设置为 UIView 的 class,位于 UITableViewCell
class GradientView: UIView {
let gradientLayer = CAGradientLayer()
func setup() {
layer.addSublayer(gradientLayer)
}
func configure() {
gradientLayer.frame = self.bounds
gradientLayer.colors = [RGBA(r: 167, g: 1, b: 88, a: 1.0).cgColor, RGBA(r: 243, g: 135, b: 32, a: 1.0).cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 1, y: 0)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
override func layoutSubviews() {
super.layoutSubviews()
setup()
configure()
}
}
问题是在重新加载 table 视图时,渐变显示动画。
layoutSubviews
被调用多次
class GradientView: UIView {
var gradientLayer:CAGradientLayer!
func setup() {
gradientLayer = CAGradientLayer()
layer.addSublayer(gradientLayer)
gradientLayer.frame = self.bounds
gradientLayer.colors = [RGBA(r: 167, g: 1, b: 88, a: 1.0).cgColor, RGBA(r: 243, g: 135, b: 32, a: 1.0).cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 1, y: 0)
}
override func layoutSubviews() {
super.layoutSubviews()
if gradientLayer == nil {
setup()
}
}
}
您在 CALayer
及其子类上设置的许多属性将默认设置动画。对于渐变图层,这包括边界、渐变颜色以及起点和终点,所有这些都在此处设置。
这称为隐式动画。
您可以通过创建事务、禁用操作、执行更改然后提交事务来关闭它:
CATransaction.begin()
CATransaction.setDisableActions(true)
// Do your stuff
CATransaction.commit()
但是,这可能会有点混乱。另一种方法是创建一个非动画层子类并使用它代替 CAGradientLayer
:
class NonAnimatingGradientLayer: CAGradientLayer {
override func action(forKey event: String) -> CAAction? {
return NSNull()
}
}
使用这个代替 CAGradientLayer
并且没有任何动画。