折腾:
[已解决]swift编辑和删除UICollectionViewCell
之后,加了:
else if selectedContactItem.id == removePersonId  {                 self.isRemoveMode = !self.isRemoveMode                 print("self.isRemoveMode=\(self.isRemoveMode)")                 self.collectionView.reloadData()             }  | 
然后重新让cell绘图,结果cell出现重叠内容:

1.尝试了:
//        let cell:UICollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(StrIdConversationManageCollectionViewCell, forIndexPath: indexPath)         let cell:UICollectionViewCell = UICollectionViewCell()  | 
不行,会出错:
Assertion failure in -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:isFocused:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/UICollectionView.m:1520 2015-12-25 14:02:41.755 JianDao[28445:1291040] *** Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘the cell returned from -collectionView:cellForItemAtIndexPath: does not have a reuseIdentifier – cells must be retrieved by calling -dequeueReusableCellWithReuseIdentifier:forIndexPath:’  | 
2.试了试:
调整布局,把之前的,手动计算frame的,都换成constraint的:
        if let contactItem = getContactItem(indexPath) {             let contactImage = contactItem.headerImageLarge             let contactImageView:UIImageView = UIImageView(image: contactImage)             //            contactImageView.center.x = cell.contentView.center.x             cell.contentView.addSubview(contactImageView) //            cell.addSubview(contactImageView)             constrain(contactImageView, cell) { contactImageView, cell in                 contactImageView.top == cell.top                 contactImageView.centerX == cell.centerX             }             if !isSperialItem(contactItem) {                 //                let nameLabelFrame = CGRectMake(0, contactImage.size.height + collectionViewCellPaddingY, contactImage.size.width, collectionViewCellNameLabelHeight)                 //                let nameLabel:UILabel = UILabel(frame: nameLabelFrame)                 let nameLabel:UILabel = UILabel()                 nameLabel.text = contactItem.name                 nameLabel.textAlignment = NSTextAlignment.Center                 nameLabel.font = UIFont.systemFontOfSize(12)                 cell.contentView.addSubview(nameLabel)                 constrain(nameLabel, cell) { nameLabel, cell in                     nameLabel.bottom == cell.bottom                     nameLabel.centerX == cell.centerX                 }                 if isRemoveMode {                     //here is got reusable cell, not draw it again, just need add extra delete button                     let removeBadgeButton:UIButton = UIButton()                     removeBadgeButton.setBackgroundImage(UIImage(named: "remove_badge"), forState: UIControlState.Normal)                     removeBadgeButton.tag = indexPath.row                     removeBadgeButton.addTarget(self, action: Selector("removeSelectedPerson:"), forControlEvents: UIControlEvents.TouchUpInside)                     cell.contentView.addSubview(removeBadgeButton)                     constrain(removeBadgeButton, cell) { removeBadgeButton, cell in                         removeBadgeButton.left == cell.right – 10                         removeBadgeButton.top == cell.top – 5                     }                 }             }         }  | 
结果问题依旧。
3.把字视图都加到cell,而不是cell.contentView上:
cell.contentView.addSubview(removeBadgeButton)  | 
都换成:
cell.addSubview(removeBadgeButton)  | 
也还是不行。
4.此时已经意识到了:
是由于用了:
let cell:UICollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(StrIdConversationManageCollectionViewCell, forIndexPath: indexPath)  | 
的dequeueReusableCellWithReuseIdentifier
所以cell都是复用了
-》之前已经存在的cell,会被随机获得拿来复用
-》导致之前的cell中还有头像图片,还有nameLabel
-》所以此处要去删除掉已有的字视图,再重新绘制,即可:
5.后来再去优化,解决,当已经处于remove模式时,点击减号,结果之前加的remove button,却还保留,的问题。
6.最终代码是:
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {         print("ConversationManageViewController cellForItemAtIndexPath")         let cell:UICollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(StrIdConversationManageCollectionViewCell, forIndexPath: indexPath) //        if isRemoveMode {             //remove previous added subview             // isRemoveMode==true: header image, name label             // isRemoveMode==false: header image, name label, remove button             //otherwise will cause overlapp namelabel             let prevAddedSubViews = cell.contentView.subviews //            print("prevAddedSubViews=\(prevAddedSubViews)")             for eachPreAddedSubView in prevAddedSubViews {                 eachPreAddedSubView.removeFromSuperview()             } //        }         if let contactItem = getContactItem(indexPath) {             let contactImage = contactItem.headerImageLarge             let contactImageView:UIImageView = UIImageView(image: contactImage)             cell.contentView.addSubview(contactImageView)             constrain(contactImageView, cell) { contactImageView, cell in                 contactImageView.top == cell.top                 contactImageView.centerX == cell.centerX             }             if !isSperialItem(contactItem) {                 let nameLabel:UILabel = UILabel()                 nameLabel.text = contactItem.name                 nameLabel.textAlignment = NSTextAlignment.Center                 nameLabel.font = UIFont.systemFontOfSize(12)                 cell.contentView.addSubview(nameLabel)                 constrain(nameLabel, cell) { nameLabel, cell in                     nameLabel.bottom == cell.bottom                     nameLabel.centerX == cell.centerX                 }                 constrain(nameLabel, contactImageView) { nameLabel, contactImageView in                     nameLabel.top == contactImageView.bottom + collectionViewCellPaddingY                 } //                constrain(nameLabel, contactImageView) { nameLabel, contactImageView in //                    distribute(by: 10, vertically: nameLabel, contactImageView) //                }                 if isRemoveMode {                     //here is got reusable cell, not draw it again, just need add extra delete button                     let removeBadgeButton:UIButton = UIButton()                     removeBadgeButton.setBackgroundImage(UIImage(named: "remove_badge"), forState: UIControlState.Normal)                     removeBadgeButton.tag = indexPath.row                     removeBadgeButton.addTarget(self, action: Selector("removeSelectedPerson:"), forControlEvents: UIControlEvents.TouchUpInside)                     cell.contentView.addSubview(removeBadgeButton)                     constrain(removeBadgeButton, cell) { removeBadgeButton, cell in                         removeBadgeButton.left == cell.right – 10                         removeBadgeButton.top == cell.top – 5                     }                 }             }         }         return cell     } … …                     dispatch_async(dispatch_get_main_queue(), { () -> Void in                         self.deleteContactItem(indexPath)                         self.collectionView.deleteItemsAtIndexPaths([indexPath])                     })     }  | 
效果是:

再去点击减号,即可还原:

转载请注明:在路上 » [已解决]swift中UICollectionViewCell在reloadData()之后显示内容出现重叠现象