UITableviewCell 中的渐变添加导致重新加载时出现动画问题
Posted
技术标签:
【中文标题】UITableviewCell 中的渐变添加导致重新加载时出现动画问题【英文标题】:Gradient addition in UITableviewCell causing animation issue on reloading 【发布时间】:2019-01-14 11:49:16 【问题描述】:我想做聊天画面,聊天气泡有点渐变。在将渐变应用到UIView
时,它会在重新加载时产生问题。
GradientView 已设置为 UIView 的类,位于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()
问题是在重新加载表格视图时,渐变显示为动画。
【问题讨论】:
【参考方案1】:您在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
,不会有任何动画。
【讨论】:
【参考方案2】: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()
【讨论】:
以上是关于UITableviewCell 中的渐变添加导致重新加载时出现动画问题的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableViewCell 中添加渐变隐藏 UILabel 文本
滚动后 UITableViewCell 内的 UIView 中的渐变发生了变化
在uitableViewCell中的UIView内放置渐变颜色