UICollectionView Cell с изображением, изменить фон с помощью щелчка

У меня есть UICollectionView с Custom CollectionView Cells, На каждой ячейке есть изображение, которое размером с целую ячейку. Теперь я хочу выделить ячейку, когда пользователь касается ячейки. Сначала я попробовал это со следующим delegate Methods:

- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor redColor];

}

- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor clearColor];
}

Но ничего не случилось. После того, как я удалил изображения из ячеек, он работал отлично. Но с изображениями ничего не происходит! Что еще я могу сделать?

4 ответа

Решение

Если у вас есть CustomCell, у вас должен быть CustomCell.m (файл реализации). В этом файле добавить это, для меня это простой способ:

-(void)setHighlighted:(BOOL)highlighted
{
    if (highlighted)
    {
        self.layer.opacity = 0.6;
        // Here what do you want.
    }
    else{
        self.layer.opacity = 1.0;
        // Here all change need go back
    }
}

Здесь вы помещаете изображение целиком поверх ячейки, поэтому ячейка находится позади изображения, вы не можете видеть фон ячейки из-за изображения. Лучше взять два изображения, одно для выделенного изображения, а другое для обычного. удалить эту строку

cell.contentView.backgroundColor = [UIColor redColor];

установите выделенное изображение следующим образом:

- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:indexPath];
UIImage *image11 = [UIImage imageNamed:@"your_highlighted_image"];
    CGRect starFrame1 = CGRectMake(0, 0, 350, 50);  
    UIImageView *starImage2 = [[UIImageView alloc] initWithFrame:starFrame1];   
    starImage2.image= image11; 
//set this image as cell background 
    [cell setBackgroundView:starImage2];

}

установите нормальное изображение следующим образом:

- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
UIImage *image11 = [UIImage imageNamed:@"your_normal_image"];
    CGRect starFrame1 = CGRectMake(0, 0, 350, 50);  
    UIImageView *starImage2 = [[UIImageView alloc] initWithFrame:starFrame1];   
    starImage2.image= image11; 
//set this image as cell background 
    [cell setBackgroundView:starImage2];
}

Попробуй вот так

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

UICollectionViewCell *selectedCell =
[collectionView cellForItemAtIndexPath:indexPath];
selectedCell.contentView.backgroundColor = nil;
[selectedCell.contentView.layer setBorderColor:[UIColor redColor].CGColor];
[selectedCell.contentView.layer setBorderWidth:3.0f];

}



- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *deselectedCell =
[collectionView cellForItemAtIndexPath:indexPath];
deselectedCell.contentView.backgroundColor = nil;
[deselectedCell.contentView.layer setBorderColor:[UIColor clearColor].CGColor];
[deselectedCell.contentView.layer setBorderWidth:3.0f];
}

Свифт версия принятого ответа

class MyCollectionViewCell: UICollectionViewCell {

    override var highlighted: Bool {
        didSet {
            if (highlighted) {
                self.layer.opacity = 0.6;
            } else {
                self.layer.opacity = 1.0;
            }
        }
    }
}

Источник

Я публикую этот ответ в интересах других, но я не полностью удовлетворен им. Вот две проблемы, с которыми я столкнулся в своем первоначальном наблюдении:

  1. Затемнение является резким и не анимированным как UIButton нажмите.
  2. Кнопки в первом столбце вообще не меняют внешний вид. Возможно, это какая-то ошибка в моем приложении, не связанная с этим фактическим методом. Пожалуйста, подтвердите или опровергните это в комментариях.
Другие вопросы по тегам