我在项目中使用的是UICollectionView,但是它没有为重用的单元绘制单元格。以为我在应用程序打开时有20个单元格,绘制方法被调用了20次。然后我将单元格的数量更改为30,然后重新加载CollectionView,然后draw方法仅被调用10次。我想调用draw方法30次,因为我在该方法中对单元格做了一些操作(添加图像)。
注意:我在iPhone 5s(iOS 10.3.3)中进行了测试
GameCollectionViewCell类下方用作CollectionView的自定义单元格
extension GameCollectionViewCell {
override func draw(_ rect: CGRect) {
var princess : UIImageView = UIImageView(image: UIImage(named: "CategoryImages/"+card!.contentImage)?.withAlignmentRectInsets(UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0 )))
var size : CGSize = CGSize(width: rect.size.width-1.8, height: rect.size.height-1.8)
var origin : CGPoint = CGPoint(x: rect.origin.x+0.9, y: rect.origin.y+0.9)
var princessRect : CGRect = CGRect(origin: origin, size: size)
princess.frame = princessRect
princess.layer.masksToBounds = true
princess.layer.cornerRadius = 2;
contentView.addSubview(princess)
}
}
答案 0 :(得分:0)
的确,您不应该像在控制器的lifeCycle方法中所做的那样覆盖扩展中的方法(例如viewDidLoad()
。还请注意,在大多数情况下,您应该调用其{ {1}}。改为创建子类。
在子类super.someFunc()
中添加子视图时,请将您的代码放入init方法中:
UICollectionViewCell
如果要更改视图图层中的任何内容,可以覆盖override init(frame: CGRect) {
super.init(frame: frame)
}
:
layoutSubviews()
我希望这会有所帮助。
答案 1 :(得分:0)
我的收藏夹视图存在相同的问题,最好的解决方案是在您的GameCollectionViewCell
说updateView()
中添加功能并将UI元素添加到子视图
func updateView() {
var princess : UIImageView = UIImageView(image: UIImage(named: "CategoryImages/"+card!.contentImage)?.withAlignmentRectInsets(UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0 )))
var size : CGSize = CGSize(width: rect.size.width-1.8, height: rect.size.height-1.8)
var origin : CGPoint = CGPoint(x: rect.origin.x+0.9, y: rect.origin.y+0.9)
var princessRect : CGRect = CGRect(origin: origin, size: size)
princess.frame = princessRect
princess.layer.masksToBounds = true
princess.layer.cornerRadius = 2;
addSubview(princess)
}
在为indexpath创建单元格的同时在viewcontroller中调用上述方法
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! GameCollectionViewCell
cell.updateView()
return cell
}
答案 2 :(得分:0)
非常感谢@RobertDresler。他救了我的一天。重新加载CollectionView后,如果调用setNeedsDisplay()方法,则会调用draw()方法。请检查以下内容。
override func prepareForReuse() {
super.prepareForReuse()
setNeedsDisplay()
}