这是代码正常工作,但当我将滚动我的集合视图,然后另一个单元格也被选中,例如18个图像可用,并首先显示六个在运行时,当我将选择任何一个位置,然后下六个位置的图像自动选择。为什么一次选两个小区我就搞不懂了。请给予我答案
这里我有6细胞在主显示故事板
UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout;
flowLayout.minimumLineSpacing = 15;
CGFloat availableWidthForCells = CGRectGetWidth(self.collectionView.frame) - flowLayout.sectionInset.left - flowLayout.sectionInset.right - flowLayout.minimumInteritemSpacing *2;
cellWidth = availableWidthForCells /6;
NSLog(@"cellWidth:%f",cellWidth);
flowLayout.itemSize = CGSizeMake(cellWidth, cellWidth);
这是我的Didselect和didDeselect方法
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell* cell = [collectionView cellForItemAtIndexPath:indexPath];
cell.layer.cornerRadius = cellWidth / 2.0;
cell.layer.backgroundColor = [UIColor blackColor].CGColor;
NSLog(@"INDEXPATH:-%ld",(long)indexPath.row);
}
-(void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell* cell = [collectionView cellForItemAtIndexPath:indexPath];
cell.layer.cornerRadius = cellWidth / 2.0;
cell.layer.backgroundColor = [UIColor whiteColor].CGColor;
}
5条答案
按热度按时间pgky5nke1#
这是因为collectionView重用了单元格;
你应该将选定单元格的IndexPath存储在一个变量中:
ObjC:
Swift:
而不是在“索引路径行的单元格”检查中:
ObjC:
Swift:
ne5o7dgx2#
感谢Alberto Scampini提供Swift 3.1的代码
ruarlubt3#
我知道我迟到了。我也有同样的问题。而且在stackoverflow里看了一圈之后。这是我的解决方案。它可以帮助初学者更容易地理解UICollectionViewCell。
“cellForItemAtIndexPath”方法控制单元格将如何显示。屏幕外的单元格将不会更新。
Swift 4
首先,你需要对你的细胞进行子类化。
现在是“cellForItemAt”方法。
然后,对于“didSelectItemAt”方法
f4t66c6m4#
那是因为细胞被重复利用了。当你
改变单元格的角半径,实际上你改变了不止一个单元格的角半径。所以你应该这样做:
r6hnlfcb5#
*Swift 5酒店
//这是100%有效的!!!//在我的例子中,我想改变按钮的背景,换句话说,改变集合视图中单元格的背景:类CustomCVCell:UICollectionViewCell {
}
//在存储集合视图的主类中创建这个变量:类CustomViewController:UIViewController {
}