iOS - Как применить цвет градиента к UICollectionViewCell backgroundView? - PullRequest
0 голосов
/ 20 ноября 2018

Мне удалось применить желаемый градиент к backgroundView моего UICollectionViewCell.Но каждый раз, когда я перезагружаю ячейку, она снова применяет мой градиент, накапливая весь градиент.

Прежде всего, вот мой метод для градиента:

static func setGradientWhite(uiView: UIView) {

    let colorBottomWhite = UIColor(red:1.00, green:1.00, blue:1.00, alpha:0.30).cgColor
    let colorTopWhite = UIColor(red:1.00, green:1.00, blue:1.00, alpha:0).cgColor

    let gradientLayer = CAGradientLayer()
    gradientLayer.colors = [ colorTopWhite, colorBottomWhite]
    gradientLayer.locations = [ 0.0, 1.0]
    gradientLayer.frame = uiView.bounds

    uiView.layer.insertSublayer(gradientLayer, at: 0)
}

Я знаю, что могу сделатьэто более общий способ, и измените способ обработки цветов, но это не главное, сейчас это для целей тестирования.

Я пытался назвать это так:

override func awakeFromNib() {
     super.awakeFromNib()
     UIUtils.setGradientWhite(uiView: self)
}

Градиенты не накапливаются таким образом, в awakeFromNib, НО, анимация не закончена, и у меня есть только половина моей ячейки с примененным градиентом.

И если я делаю это в этом методе:

override func layoutSubviews() {
     super.layoutSubviews()

     CATransaction.begin()
     CATransaction.setDisableActions(true)
     UIUtils.setGradientWhite(uiView: self)
     CATransaction.commit()
}

Градиентная анимация правильно завершена, применяя ко всему виду, но когда ячейка перезагружается, она применяет новый градиент поверх предыдущего, пока я больше не вижу свою ячейку (в данном случае слишком много белого здесь).

Есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 20 ноября 2018

Можно попробовать

override func layoutSubviews() {
   super.layoutSubviews() 
   if !(self.layer.sublayers?.first is CAGradientLayer) { 
       CATransaction.begin()
       CATransaction.setDisableActions(true)
       UIUtils.setGradientWhite(uiView: self)
       CATransaction.commit()
   }
}
...