Ответ 1
Класс сообщает только о состоянии подсветки, но не меняет внешний вид. Вам нужно будет сделать это программно, например. изменение фона ячейки.
Подробности описаны в Руководство по программированию CollectionView.
У меня есть UICollectionView, который состоит из пользовательского подкласса UICollectionViewCell. Ячейка отображается правильно и правильно реагирует на пользовательские касания, активируя этот метод:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
Однако я понимаю, что когда пользователь касается ячейки, он должен выделять (синим цветом), а затем подсветка должна уходить, когда пользователь поднимает палец. Этого не происходит. Любые мысли о том, почему?
Вот какой код:
В источнике данных UICollectionView:
@implementation SplitCheckViewCollection
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier = @"ReceiptCellIdentifier";
SplitCheckCollectionCell *cell = (SplitCheckCollectionCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
cell.cellName.text = [NSString stringWithFormat:@"%@%i",@"#",indexPath.row+1];
return cell;
}
В реализации UICollectionViewCell:
@implementation SplitCheckCollectionCell
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"SplitCheckCollectionCell" owner:self options:nil];
if ([arrayOfViews count] < 1) {
return nil;
}
if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) {
return nil;
}
self = [arrayOfViews objectAtIndex:0];
}
return self;
}
Класс сообщает только о состоянии подсветки, но не меняет внешний вид. Вам нужно будет сделать это программно, например. изменение фона ячейки.
Подробности описаны в Руководство по программированию CollectionView.
Как сказал SAE, вы должны сделать это самостоятельно в подклассе. Другая проблема, с которой я столкнулся, заключается в том, что при нажатии на ячейку она получала подсветку и перерисовку, если ячейка была нажата и удерживалась. Однако, если постучать быстро, перерисовка никогда не происходила.
Я создал ячейку в раскадровке, и в представлении коллекции "задерживает содержание касаний" по умолчанию. Я отмахивался от этого, и он мгновенно показывал, как палец коснулся экрана.
Я использую пользовательскую процедуру рисования, которая проверяет значение isHighlighted. Вам также необходимо переопределить setHighlighted в пользовательской ячейке, как показано ниже, или ничья никогда не будет вызвана.
-(void)setHighlighted:(BOOL)highlighted
{
[super setHighlighted:highlighted];
[self setNeedsDisplay];
}
Есть два метода делегирования, которые вы должны реализовать:
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath;
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath;
Полный код выделения ячейки представления коллекции с анимацией:
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
//set color with animation
[UIView animateWithDuration:0.1
delay:0
options:(UIViewAnimationOptionAllowUserInteraction)
animations:^{
[cell setBackgroundColor:[UIColor colorWithRed:232/255.0f green:232/255.0f blue:232/255.0f alpha:1]];
}
completion:nil];
}
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
//set color with animation
[UIView animateWithDuration:0.1
delay:0
options:(UIViewAnimationOptionAllowUserInteraction)
animations:^{
[cell setBackgroundColor:[UIColor clearColor]];
}
completion:nil ];
}
Вам нужно реализовать UICollectionViewDataSource если вы хотите, чтобы эффект "Выделение" и "Невысокий свет" касался касания и отпускания,
вот пример кода
#pragma mark - UICollectionView Datasource
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor colorWithRed:235/255.0f green:236/255.0f blue:237/255.0f alpha:.5];
}
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = nil;
}
Вы можете получить hilight для рисования, добавив эти строки в настройку UICellView.
UIView* selectedBGView = [[UIView alloc] initWithFrame:self.bounds];
selectedBGView.backgroundColor = [UIColor redColor];
self.selectedBackgroundView = selectedBGView;
От "Управление визуальным состоянием для выбора и основных элементов"... Представления коллекции поддерживают выбор по одному элементу по умолчанию и могут быть настроены для поддержки выбора нескольких элементов или вообще отключены. Представление коллекции обнаруживает краны внутри его границ и подчеркивает или соответственно выбирает соответствующую ячейку. По большей части представление коллекции изменяет только свойства ячейки, чтобы указать, что она выбрана или выделена; он не изменяет внешний вид ваших ячеек, за одним исключением. Если ячейка selectedBackgroundView содержит допустимое представление, представление коллекции показывает, что представление, когда ячейка подсвечена или выбрана.
Как указывает SAE, вам придется вручную сделать это в ячейке с подсветкой. Самый простой способ, который я нашел, - использовать методы tableview didHighlightRowAtIndexPath и didUnhighlightRowAtIndexPath, которые устанавливают "выделенный" bool в вашем экземпляре UICollectionCell, а затем переопределяют это свойство в классе подкласса UICollectionCell. Красота в том, что анимация уже существует для вас. Вы также можете сделать то же самое в ситуации UITableView/UITableViewCell.
Итак, в вашем UICollectionView с использованием метода UICollectionViewDelegate:
func collectionView(collectionView: UICollectionView, didHighlightItemAtIndexPath indexPath: NSIndexPath) {
collectionView.selectItemAtIndexPath(indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition.None)
}
func collectionView(collectionView: UICollectionView, didUnhighlightItemAtIndexPath indexPath: NSIndexPath) {
collectionView.deselectItemAtIndexPath(indexPath, animated: true)
}
Затем в вашем подклассе UICollectionViewCell добавьте следующее:
override var highlighted:Bool{
didSet{
println("Highlighted is set \(highlighted)")
if(highlighted == true){
self.backgroundColor = UIColor.redColor()
}else{
self.backgroundColor = UIColor.blueColor()
}
}
}
Если вы хотите изменить визуальные эффекты, вы можете установить ячейку на выбранную на didHighlightItemAtIndexPath и снять выделение с didHighlightItemAtIndexPath следующим образом:
- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
[collectionView selectItemAtIndexPath:indexPath animated:YES scrollPosition:NO];
}
- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
[collectionView deselectItemAtIndexPath:indexPath animated:YES];
}
вы можете попробовать этот код:
- (void)collectionView:(UICollectionView *)colView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = [UIColor blueColor];
}
и
- (void)collectionView:(UICollectionView *)colView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell* cell = [colView cellForItemAtIndexPath:indexPath];
cell.contentView.backgroundColor = nil;
}
We can create our own highlight and unhighlight effect on collectionView cell by adding and removing a temporary view with some background color as follows:
-(void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *collectionViewCell = (UICollectionViewCell *)
[collectionView cellForItemAtIndexPath:indexPath];
UIView *tapHighlightView = (UIView*)[collectionViewCell.contentView
viewWithTag:10];
if (!tapHighlightView) {
tapHighlightView = [[UIView alloc]
initWithFrame:collectionViewCell.contentView.frame];
tapHighlightView.backgroundColor =[UIColor blackColor alpha:0.4];
tapHighlightView.tag = 10;
[collectionViewCell.contentView addSubview:tapHighlightView];
}
}
-(void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath{
UICollectionViewCell *collectionViewCell = (UICollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
UIView *tapHighlightView = (UIView*)[collectionViewCell.contentView viewWithTag:10];
if (tapHighlightView != nil) {
[tapHighlightView removeFromSuperview];
}
}