我有一個UICollectionViewCell:失敗reloadData()之後重繪UICollectionViewCell
「梯度視圖」 是具有梯度一個UIView:
數據的源是CoreData。 在收藏觀,我有按鈕那種CoreData:
@IBAction func allMealsBtn(_ sender: Any) {
let fetchRequest: NSFetchRequest<Meal> = Meal.fetchRequest()
let dateSort = NSSortDescriptor(key: "created", ascending: false)
fetchRequest.sortDescriptors = [dateSort]
let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
controller.delegate = self
self.controller = controller
do {
try controller.performFetch()
} catch {
let error = error as NSError
print("Couldn't fetch data from CoreData with error: \(error.debugDescription)")
}
collectionView.reloadData()
}
按排序按鈕,集合視圖重載後,顯示正確的數據。 但是,漸變視圖會倍增,就像細胞沒有被破壞一樣。 這裏是我的數據多次排序後看到:
如何確保我的手機是從頭開始重繪?
編輯:
我的自定義單元格類。 因此,在configureCell中,我必須檢查我的gradientView是否添加到視圖中,如果是,則添加漸變,如果沒有,添加它並添加漸變。 我該如何做這個檢查?
類CollectionCell:UICollectionViewCell {
@IBOutlet weak var mealImg: UIImageView!
@IBOutlet weak var mealTitleLbl: UILabel!
@IBOutlet weak var gradientView: UIView!
func configureCell(meal: Meal) {
mealTitleLbl.text = meal.title
let img = meal.getMealImage()
mealImg.image = img
gradientView.addGradientWithColor(color: UIColor.clear)
// How can I check if my gradientView is added to the view, if yes, then add gradient, if not, add it, and only then add gradient.
}
override func prepareForReuse() {
super.prepareForReuse()
gradientView.removeFromSuperview()
}
}
extension UIView {
func addGradientWithColor(color: UIColor) {
let gradient = CAGradientLayer()
gradient.frame = self.bounds
let topColor = UIColor(red:0.07, green:0.07, blue:0.07, alpha:1)
gradient.colors = [topColor.cgColor, color.cgColor]
self.layer.insertSublayer(gradient, at: 0)
}
}
編輯: 我已經放棄了擴展並實現了標誌邏輯。 但是,在視圖被移除之後,執行搜索後它再也不會出現在單元格中。 有什麼想法?
class CollectionCell: UICollectionViewCell {
@IBOutlet weak var mealImg: UIImageView!
@IBOutlet weak var mealTitleLbl: UILabel!
@IBOutlet weak var gradientView: UIView!
var isGradientAdded = false
func configureCell(meal: Meal) {
mealTitleLbl.text = meal.title
let img = meal.getMealImage()
mealImg.image = img
if isGradientAdded == false {
addGradient()
isGradientAdded = true
}
}
override func prepareForReuse() {
super.prepareForReuse()
gradientView.removeFromSuperview()
}
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)
}
}
嘗試覆蓋prepareForReuse方法 –
@WetSweater裏面應該做些什麼? –
您是否在單元格的某處或在collectionView數據源方法中使用了任何「addSubview」方法? –