【问题标题】:Gradient addition in UITableviewCell causing animation issue on reloadingUITableviewCell 中的渐变添加导致重新加载时出现动画问题
【发布时间】: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()
    }
}

问题是在重新加载表格视图时,渐变显示为动画。

【问题讨论】:

    标签: ios swift uitableview calayer cagradientlayer


    【解决方案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()
              }
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2019-08-08
        • 2020-04-21
        • 2020-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多