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;
}
}
}
}
Я публикую этот ответ в интересах других, но я не полностью удовлетворен им. Вот две проблемы, с которыми я столкнулся в своем первоначальном наблюдении:
- Затемнение является резким и не анимированным как
UIButton
нажмите. - Кнопки в первом столбце вообще не меняют внешний вид. Возможно, это какая-то ошибка в моем приложении, не связанная с этим фактическим методом. Пожалуйста, подтвердите или опровергните это в комментариях.