删除子视图然后将其添加回来

时间:2017-01-31 02:01:39

标签: ios swift core-data uicollectionview uicollectionviewcell

我有一个带有渐变子视图的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
}
}

1 个答案:

答案 0 :(得分: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的贡献。