gpt4 book ai didi

ios - 删除 subview 然后将其添加回来

转载 作者:行者123 更新时间:2023-11-30 12:43:29 29 4
gpt4 key购买 nike

我有一个带有渐变 subview 的UICollectionViewCell。在我的 View Controller 中,我有一些按钮对 CoreData 进行排序,然后对 UICollectionView 上的 reloadData() 进行排序。为了避免一次又一次地绘制渐变 subview (就像过去发生的那样),我在 prepareForReuse() 中实现了 removeFromSuperview()。在那里我还实现了一个标记来跟踪梯度的存在,因此当单元格加载时我仍然添加一个新的梯度。但是,删除渐变后,我的 willMove(toSuperview: ) 不起作用,并且渐变 View 不会出现。我的逻辑有什么问题吗?

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
}
}

最佳答案

我能够通过以下方式修复逻辑。在 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 添加到渐变 View 一次。

我了解到,通过从 super View 中删除 View ,它们仍然存在并且可以编辑。

感谢@Luis 和@LeoDabus 的贡献。

关于ios - 删除 subview 然后将其添加回来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41948576/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com