只有最后一个单元格突出显示无关紧要在UICollectionView

时间:2018-06-11 08:49:02

标签: ios objective-c uicollectionview uicollectionviewcell

这是一件非常疯狂的事情,我只是不明白。

我有一个充满图像的UICollectionView。我希望能够选择一个图像并在其周围绘制一个红色边框(或添加一个x,更改alpha,或对其执行任何操作)。但无论我做什么或放置代码的地方,只有视图中的最后一个图像才会出现红色边框。在选择单元格后,所有内容都按预期执行 - (删除正确的图像(正确的索引路径上的图像),重新加载collectionview,并更新文档目录)。为什么我不能突出显示正确的图像?

我确实有一个TapGestureRecognizer来实现绘制边框,如果这有所不同但当我从按下按钮调用代码时它做了同样的事情,在这种情况下,预计所有单元格将获得一个红色边框,但那也没发生。只有最后一个细胞才有边界???

为清楚起见,请说集合视图中有九个图像。我可以点击索引0,但只有索引8才能获得红色边框。同样的事情,如果我点击索引1到偶数8本身,只有索引8才能获得边界。

我尝试的另一件事是在每个单元格上设置x的图像,并在呈现集合视图时隐藏它。当在所选索引处点击图像时,我试图取消隐藏它。同样的事情发生了当点击一个单元格时,最后一个单元格获取x而不是所选单元格!到底是什么?

所有我的NSLog都表明正在读取正确的索引路径并且在最终结果中证明了所有内容都得到更新,但如果无法突出显示正确的单元格,则用户体验不佳。

我非常感谢有关这种荒谬的任何想法。

细胞以正常方式填充:

_cell.bookImageView.image = [_book.imageArray objectAtIndex:indexPath.row];

以下是cellForItemAtIndexPath中的点按手势:

UITapGestureRecognizer *deleteImageTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(deleteImageTapped:)];
deleteImageTap.numberOfTapsRequired = 2;
 _cell.bookImageView.tag = indexPath.row;
 [_cell.bookImageView addGestureRecognizer:deleteImageTap];
 _cell.bookImageView.userInteractionEnabled = YES;

这就是我尝试做的所有事情:

_cell.layer.borderColor = [UIColor yellowColor].CGColor;
_cell.layer.borderWidth = 2;

甚至是这样:

_cell.alpha = 0.4;

我尝试过代码的几个地方:

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

-(void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath

//my tap gesture method
-(void)deleteImageTapped:(UITapGestureRecognizer *)gesture

//how I get the indexpath in my method
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:gesture.view.tag inSection:0];

2 个答案:

答案 0 :(得分:0)

我非常了解你的问题。 我建议你使用CellForRowAtIndexPath中的一个按钮,而不是UiTapGesture。

首先在单元格中添加按钮。

cell.yourbutton.tag = indexPath.row;

[cell.yourbutton addTarget:self action:@selector(yourButtonClicked :) forControlEvents:UIControlEventTouchUpInside];

- (无效)yourButtonClicked:(的UIButton *)发送方

{

if(sender.tag == 0) {

NSIndexPath * indexPath = [NSIndexPath indexPathForRow:sender.tag inSection:0];

}

}

答案 1 :(得分:0)

事实证明,我只需要在didHighlightItemAtIndexPath和didUnhighlightItemAtIndexPath中“提及”我的单元格。但无论出于何种原因,将更改添加到单元格中从未调用过。

我将UITapGestureRecognizer留在我的cellForItemAtIndexPath中,并将更改添加到从我的点击手势调用的方法中的单元格。

基本设置如下:

@property (nonatomic, strong) CollectionViewCell *cell;


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
   _cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];

   if (!_cell.selected)
    {
        //this "turns off" the cell changes
        _cell.alpha = 1.0;
        _cell.deleteButton.alpha = 0.0;
        _cell.bookImageView.layer.borderColor = nil;
        _cell.bookImageView.layer.borderWidth = 0;
    }

   UITapGestureRecognizer *deleteImageTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(deleteImageTapped:)];
    deleteImageTap.numberOfTapsRequired = 2;
    _cell.bookImageView.tag = indexPath.row;
    [_cell.bookImageView addGestureRecognizer:deleteImageTap];
    _cell.bookImageView.userInteractionEnabled = YES;

   return _cell;
}


-(void)deleteImageTapped:(UITapGestureRecognizer *)gesture
{
    _cell.alpha = 0.4;
    _cell.deleteButton.alpha = 1.0;
    _cell.bookImageView.layer.borderColor = [UIColor redColor].CGColor;
    _cell.bookImageView.layer.borderWidth = 5;


   //more code to delete image blah blah blah
}

然后这就是我“提及”我的手机

的地方
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
    _cell = (CollectionViewCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
}

- (void)collectionView:(UICollectionView *)colView  didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
    _cell = (CollectionViewCell *)[self.collectionView cellForItemAtIndexPath:indexPath];
}

希望这可以帮助别人!