Swift CollectionView Deselection无法正常工作

时间:2017-11-20 07:30:15

标签: ios swift

我正在使用自定义UICollectionViewFlowLayout类来实现滚动视图的多滚动行为。没问题。 但是为了进行自定义选择和取消选择,我需要在shouldSelectItemAt函数中使用自定义代码进行正确的选择/取消选择。 这是代码:

MyCustomCollectionViewController内部:

func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
if(collectionView == customContentCollectionView){

let cell:MyContentCell = collectionView.cellForItem(at: indexPath)! as! MyCollectionViewController.MyContentCell
if(self.bubbleArray[indexPath.section][indexPath.item].umid != ""){

// DESELECTION LOGIC
if(previouslySelectedIndex != nil){

let (bubbleBorder, bubbleFill) = getBubbleColor(selected: false)

// following line is error prone (executes but may or may not fetch the cell, sometimes deselect sometimes doesn't)
let prevCell = try collectionView.cellForItem(at: previouslySelectedIndex) as? MyCollectionViewController.MyContentCell

prevCell?.shapeLayer.strokeColor = bubbleBorder.cgColor
prevCell?.shapeLayer.fillColor = bubbleFill.cgColor
prevCell?.shapeLayer.shadowOpacity = 0.0
prevCell?.labelCount.textColor = bubbleBorder
}
previouslySelectedIndex = []
previouslySelectedIndex = indexPath


// SELECTION LOGIC
if(self.bubbleArray[indexPath.section][indexPath.item].interactions != ""){
let (bubbleBorder, bubbleFill) = getBubbleColor(selected: true)
cell.shapeLayer.strokeColor = bubbleBorder.cgColor
cell.shapeLayer.fillColor = bubbleFill.cgColor
cell.shapeLayer.shadowOffset = CGSize(width: 0, height: 2)
cell.shapeLayer.shadowOpacity = 8
cell.shapeLayer.shadowRadius = 2.0
cell.labelCount.textColor = UIColor.white
}
}
return false
}
return true
}

MyContentCell的代码:

class MyContentCell: UICollectionViewCell{ // CODE TO CREATE CUSTOM CELLS

var gradient = CAGradientLayer()
var shapeLayer = CAShapeLayer()
var horizontalLine = UIView()
var verticalLeftLine = UIView()

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
setup()
}

override init(frame: CGRect) {
super.init(frame: frame)
setup()
}

let labelCount: UILabel = {
let myLabel = UILabel()
return myLabel
}()


func setup(){ // initializing cell components here as well as later in cellForItemAt method
............
}

override func prepareForReuse() {
self.shapeLayer.fillColor = UIColor.white.cgColor
self.shapeLayer.shadowOpacity = 0.0
}
}

可能问题在于,当选择一个单元格并且刚刚从屏幕拖出时,它可能不会被破坏,这就是为什么准备重用功能不跟踪它以进行取消选择。那么请告诉我如何取消选择刚刚离开屏幕的细胞(可见指数)?

1 个答案:

答案 0 :(得分:0)

您需要使布局无效

collectionView?.collectionViewLayout.invalidateLayout()