Подтвердить что ты не робот

Почему UICollectionView UICollectionViewCell не выделяет пользователя прикосновением?

У меня есть 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;
}
4b9b3361

Ответ 1

Класс сообщает только о состоянии подсветки, но не меняет внешний вид. Вам нужно будет сделать это программно, например. изменение фона ячейки.

Подробности описаны в Руководство по программированию CollectionView.

Ответ 2

Как сказал SAE, вы должны сделать это самостоятельно в подклассе. Другая проблема, с которой я столкнулся, заключается в том, что при нажатии на ячейку она получала подсветку и перерисовку, если ячейка была нажата и удерживалась. Однако, если постучать быстро, перерисовка никогда не происходила.

Я создал ячейку в раскадровке, и в представлении коллекции "задерживает содержание касаний" по умолчанию. Я отмахивался от этого, и он мгновенно показывал, как палец коснулся экрана.

Я использую пользовательскую процедуру рисования, которая проверяет значение isHighlighted. Вам также необходимо переопределить setHighlighted в пользовательской ячейке, как показано ниже, или ничья никогда не будет вызвана.

-(void)setHighlighted:(BOOL)highlighted
{
    [super setHighlighted:highlighted];
    [self setNeedsDisplay];
}

Ответ 3

Есть два метода делегирования, которые вы должны реализовать:

- (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 ];
}

Ответ 4

Вам нужно реализовать 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;
 }

Ответ 5

Вы можете получить hilight для рисования, добавив эти строки в настройку UICellView.

UIView* selectedBGView = [[UIView alloc] initWithFrame:self.bounds];
selectedBGView.backgroundColor = [UIColor redColor];
self.selectedBackgroundView = selectedBGView;

От "Управление визуальным состоянием для выбора и основных элементов"... Представления коллекции поддерживают выбор по одному элементу по умолчанию и могут быть настроены для поддержки выбора нескольких элементов или вообще отключены. Представление коллекции обнаруживает краны внутри его границ и подчеркивает или соответственно выбирает соответствующую ячейку. По большей части представление коллекции изменяет только свойства ячейки, чтобы указать, что она выбрана или выделена; он не изменяет внешний вид ваших ячеек, за одним исключением. Если ячейка selectedBackgroundView содержит допустимое представление, представление коллекции показывает, что представление, когда ячейка подсвечена или выбрана.

Ответ 6

Как указывает 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()
        }
    }
}

Ответ 7

Если вы хотите изменить визуальные эффекты, вы можете установить ячейку на выбранную на 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];
}

Ответ 8

вы можете попробовать этот код:

- (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;
}

Ответ 9

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];
        }
    }