CollectionView, изменить цвет ячейки

у меня есть collectionView с 52 изображениями,

по методу didSelectItemAtIndexPath у меня есть этот код:

var cell : UICollectionViewCell = collectionView.cellForItemAtIndexPath(indexPath)! 
        cell.backgroundColor = UIColor.greenColor()

цвет фона меняется, НО, когда я прокручиваю свой collectionView, другая ячейка имеет зеленый цвет фона, я предполагаю, что collectionView делает некоторую перерисовку, и некоторые странные вещи происходят с indexPath или что-то в этом роде,

Могли бы действительно пригодиться советы о том, как изменить цвет только одной ячейки, даже когда вы прокручиваете представление коллекции вверх и вниз,

Спасибо!

D


person Deniss    schedule 09.06.2015    source источник
comment
вы создали collectionView с помощью InterfaceBuilder ?   -  person Fadi Obaji    schedule 10.06.2015
comment
он заполняется изображениями программно, но создается в раскадровке.   -  person Deniss    schedule 10.06.2015
comment
Хорошо, тогда вы можете изменить цвет фона ячейки из свойств ячейки в раскадровке, не нужно кодировать. Вы знаете, как это сделать?   -  person Fadi Obaji    schedule 10.06.2015
comment
мне нужно изменить цвет, когда человек выбирает один =)   -  person Deniss    schedule 10.06.2015
comment
Проверьте мой ответ здесь: ‹stackoverflow.com/a/44112257/5416775› Это может сработать...!   -  person Abirami Bala    schedule 22.05.2017


Ответы (3)


Ячейка используется повторно. Вот в чем причина. В вашем классе ячеек вы должны добавить фон по умолчанию в методе prepareForReuse. Или вы можете установить фон в своей ячейке forItemAtIndexPath. Первый подход лучше.

person MKoosej    schedule 09.06.2015
comment
спасибо, это частично решило проблему ^_^, теперь, когда я прокручиваю вверх или вниз, моя выбранная ячейка теряет зеленый цвет. Но дубликатов нет, хе-хе. - person Deniss; 10.06.2015
comment
Кроме того, метод cellforItemAtIndexPath также создает 2 зеленые ячейки. - person Deniss; 10.06.2015
comment
Вы можете сохранить selectedIndex в свойстве и проверить, выбрано ли оно, чтобы сделать его зеленым в cellforItemAtIndexPath. - person MKoosej; 10.06.2015
comment
Какой из них вы пытаетесь, prepareForReuse или cellForItemAtIndexPath? - person MKoosej; 10.06.2015
comment
Всегда устанавливайте цвет фона, независимо от того, выбран он или нет. Хорошо понимать, как работает повторное использование ячеек в представлении коллекции, с чем вы имеете дело. - person MKoosej; 10.06.2015
comment
да, спасибо, я установил цвет фона, чтобы очистить для prepareForReuse. но моя исходная выбранная ячейка также теряет цвет. стараюсь копать дальше. - person Deniss; 10.06.2015
comment
Вы должны знать порядок, в котором эти вещи вызываются. Объект ячейки, который вы получаете в cellforItemAtIndexPath, является повторно используемой ячейкой и появляется после того, как ваш prepareForReuse выполнил свою работу, после этого вы должны делать другие вещи, такие как окрашивание выбранной ячейки. - person MKoosej; 10.06.2015

спасибо MKoosej и другим ребятам,

Мне удалось заставить его работать,

пришлось добавить метод в мой customCell.swift:

override func prepareForReuse() {
        self.backgroundColor = UIColor.clearColor()
    }

затем в cellForItemAtIndexPath я проверяю сохраненный indexPath.row, если он был выбран, я изменил цвет.

Теперь это работает при прокрутке.

Еще раз спасибо, узнал что-то новое!

Денис

person Deniss    schedule 09.06.2015

Отредактировано

В вашем файле CustomCell.m:

-(void)setHighlighted:(BOOL)highlighted
{
if (highlighted)
{
    self.layer.opacity = 0.6;
    //or whatever you want here
}
else{
    self.layer.opacity = 1.0;
    //revert back the changes 
}
}

И вы можете идти.

Надеюсь, это поможет :)

person Fadi Obaji    schedule 09.06.2015
comment
это CollectionView, а не tableView =) - person Deniss; 10.06.2015
comment
затем используйте его в методе collectionView, я раньше не использовал collectionView, но код правильный, проверьте его :) - person Fadi Obaji; 10.06.2015
comment
Вы используете пользовательский класс? - person Fadi Obaji; 10.06.2015
comment
пользовательский класс для ячейки, да. Мне нужно, чтобы они были разных цветов фона. - person Deniss; 10.06.2015
comment
я использую swift, поэтому я получаю аналогичный код, который вы предложили, но происходит то же самое, когда вы прокручиваете, ячейка используется повторно, а непрозрачность возвращается к 1,0 здесь: var Hihglighted:Bool = false { didSet { self.layer. непрозрачность = 0,6; } } - person Deniss; 10.06.2015
comment
если я оставлю метод prepareForReuse, то у меня будет 2 ячейки с измененной непрозрачностью. - person Deniss; 10.06.2015
comment
хммм странно, это официальная документация /prepareForReuse" rel="nofollow noreferrer">developer.apple.com/library/prerelease/ios/documentation/UIKit/ - person Fadi Obaji; 10.06.2015