Добавление градиента в UITableviewCell, вызывающее проблемы с анимацией при перезагрузке - PullRequest
0 голосов
/ 14 января 2019

Я хочу сделать экран чата, и пузыри чата имеют некоторый градиент. При применении градиента к 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()
    }
}

Проблема в том, что при перезагрузке табличного представления градиент отображается с анимацией.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Многие свойства, которые вы установили для 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, и ничто не будет анимировано.

0 голосов
/ 14 января 2019

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()
        }
    }

}
...