简体   繁体   中英

didSelectItemAtIndexPath modifying multiple cells in UICollectionView

I have collection view with 30 items, and want to perform something on press. I do it in this way:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! ItemCell

    var translucentView = ILTranslucentView(frame: CGRectMake(0, 0, cell.contentView.frame.size.width, cell.contentView.frame.size.height))
    translucentView.translucentAlpha = 0.9
    translucentView.translucentStyle = UIBarStyle.BlackTranslucent
    translucentView.translucentTintColor = UIColor.clearColor()
    translucentView.backgroundColor = UIColor.clearColor()
    translucentView.alpha = 0.0
    cell.contentView.addSubview(translucentView)
    UIView.animateWithDuration(0.4, animations: {
        translucentView.alpha = 1.0
    })
}

The function works as expected, however the view appears not only on the tapped cell, but also on the cell in the same position that is not visible on the screen. So if there are 3 visible cells on the screen and I tap on number 1, then when I scroll the view has been added to cell 4, 7, etc...

UICollectionView re-use cells like to UITableView . When a cell is scrolled offscreen it is added to queue, and will be re-used for the next cell to be scrolled onscreen(eg cell 4, 7 ...).

Simply removing the translucentView will solve this issue:

UIView.animateWithDuration(0.4, animations: { () -> Void in
    translucentView.alpha = 1.0
}) { (finish) -> Void in
    translucentView.removeFromSuperview()
}

You can create the translucentView in the ItemCell and update its status in the cellForItemAtIndexPath method:

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(CellIdentifier, forIndexPath: indexPath) as! ItemCell

    if find(collectionView.indexPathsForSelectedItems() as! [NSIndexPath], indexPath) != nil {
        cell.translucentView.alpha = 1.0
    } else {
        cell.translucentView.alpha = 0.0
    }

    return cell
}

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! ItemCell

    UIView.animateWithDuration(0.4, animations: {
        cell.translucentView.alpha = 1.0
    })
}

override func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! ItemCell

    UIView.animateWithDuration(0.4, animations: {
        cell.translucentView.alpha = 0.0
    })
}

did you set your numberOfSectionsInTableView correctly like that?

 func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int      {
    return 1
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM