0

У меня есть UICollectionViewCell с подглядыванием градиента. На мой взгляд, контроллер, у меня есть кнопки, сортирующие CoreData, а затем reloadData() на UICollectionView. Чтобы избежать повторного рисования подграфа градиента (как это было в прошлом), я реализую removeFromSuperview() в prepareForReuse(). Там я также реализую флаг, который отслеживает существование градиента, поэтому я все же добавляю новый градиент, когда ячейка загружается. Однако после удаления градиента мой willMove(toSuperview:) не работает, а вид градиента не отображается. Что случилось с моей логикой?Удаление подзапроса, а затем его добавление

class CollectionCell: UICollectionViewCell { 

@IBOutlet weak var mealImg: UIImageView! 
@IBOutlet weak var mealTitleLbl: UILabel! 
@IBOutlet weak var gradientView: UIView! 

var gradientWasRemoved = false 

func configureCell(meal: Meal) { 
    mealTitleLbl.text = meal.title 

    let img = meal.getMealImage() 
    mealImg.image = img 

    addGradient()  
} 

    func addGradient() { 
    let gradient = CAGradientLayer() 
    gradient.frame = gradientView.bounds 
    let topColor = UIColor(red:0.07, green:0.07, blue:0.07, alpha:1) 
    let botomColor = UIColor.clear 
    gradient.colors = [topColor.cgColor, botomColor.cgColor] 
    gradientView.layer.insertSublayer(gradient, at: 0) 

    if gradientWasRemoved == true { 
     gradientView.willMove(toSuperview: self) 
    } 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 

    gradientView.removeFromSuperview() 
    gradientWasRemoved = true 
} 
} 
+0

http://stackoverflow.com/questions/24380535/how-to-apply-gradient-to-background-view-of-ios-swift-app/37243106#37243106 –

+0

На мой взгляд, ваш 'gradientView' является 'weak', и он будет равен нулю после того, как вы назовете' gradientView.removeFromSuperview() '. – nynohu

+0

Вы говорите, что вид градиента не добавлен обратно? Возможно, вам нужно обязательно вызвать addSubview в ячейке, так как я не вижу, как вы добавляете это обратно. – Luis

ответ

0

Я смог исправить логику следующим образом. В классе UICollectionViewCell:

import UIKit 

class CollectionCell: UICollectionViewCell { 

@IBOutlet weak var mealImg: UIImageView! 
@IBOutlet weak var gradientView: UIView! 

@IBOutlet weak var mealTitleLbl: UILabel! 

var gradientWasRemoved = false 

func configureCell(meal: Meal) { 
    mealTitleLbl.text = meal.title 

    let img = meal.getMealImage() 
    mealImg.image = img 

    addGradient() 
} 

    func addGradient() { 

    let gradient = CAGradientLayer() 
    gradient.frame = gradientView.bounds 
    let topColor = UIColor(red:0.07, green:0.07, blue:0.07, alpha:1) 
    let botomColor = UIColor.clear 
    gradient.colors = [topColor.cgColor, botomColor.cgColor] 

    if gradientWasRemoved == false { 
    gradientView.layer.insertSublayer(gradient, at: 0) 
    } else if gradientWasRemoved == true { 
     self.addSubview(gradientView) 
    } 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 

    gradientView.removeFromSuperview() 
    gradientWasRemoved = true 
} 

} 

В prepareForReuse() я не удаляла gradientView, я удалил его из SuperView. Я установил там флаг, который был удален. С тех пор как я не сделал nil мой gradientView Мне удалось запустить addGradient() и получить gradientView.bounds для создания новых CGGradientLayer. Перед добавлением нового слоя в gradientView, я выполнил if чек. Если мы удалили gradientView, то мы не добавим новый CGGradientLayer, а просто положим наш gradientView назад. Таким образом, мы добавляем CGGradientLayer в наш gradientView только один раз.

Я узнал, что, удаляя взгляды из Superview, они все еще живы и могут быть отредактированы.

Спасибо @ Luis и @LeoDabus за ваш вклад.

Смежные вопросы