0

Ich habe eine UICollectionViewCell mit einer Gradientenunteransicht. In meiner Ansicht Controller, habe ich Tasten, die CoreData und dann reloadData() auf der UICollectionView sortieren. Um zu vermeiden, dass meine Unteransicht immer wieder neu gezeichnet wird (wie es in der Vergangenheit der Fall war), implementiere ich removeFromSuperview() in prepareForReuse(). Dort implementiere ich auch ein Flag, das den Gradientenverlauf verfolgt, so dass ich immer noch einen neuen Gradienten hinzufüge, wenn die Zelle geladen wird. Aber nach dem Entfernen des Farbverlaufs funktioniert meine willMove(toSuperview:) nicht, und die Verlaufsansicht wird nicht angezeigt. Was ist los mit meiner Logik?Eine Unteransicht entfernen und dann wieder hinzufügen

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

Meiner Meinung nach ist Ihr 'gradientView' 'weak' und es wird null sein, nachdem Sie' gradientView.removeFromSuperview() 'aufgerufen haben. – nynohu

+0

Sie sagen, dass die Farbverlaufsansicht nicht hinzugefügt wurde? Vielleicht müssen Sie sicher sein, dass addSubview auf der Zelle aufgerufen wird, da ich nicht sehen kann, dass Sie das wieder einfügen. – Luis

Antwort

0

konnte ich die Logik beheben mit folgenden. In UICollectionViewCell Klasse:

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 
} 

} 

In prepareForReuse() ich nicht gradientView löschen habe ich es aus dem Superview entfernt. Ich habe dort die Flagge gesetzt, dass es entfernt wurde. Da ich nicht nil mein gradientView war, konnte ich addGradient() ausführen und auf gradientView.bounds für die Erstellung von neuen CGGradientLayer zugreifen. Unmittelbar vor dem Hinzufügen einer neuen Ebene zu gradientView führte ich if überprüfen. Wenn wir gradientView entfernt haben, fügen wir keine neue CGGradientLayer hinzu, sondern setzen einfach unsere gradientView zurück. Auf diese Weise fügen wir CGGradientLayer zu unserem gradientView nur einmal hinzu.

Ich habe gelernt, dass durch das Entfernen von Ansichten aus Superview sie noch am Leben sind und bearbeitet werden können.

Danke @Luis und @LeoDabus für Ihren Beitrag.

Verwandte Themen