为什么UICollectionView的UICollectionViewCell不突出于用户的触摸?

2019-07-19 02:24发布

我有一个是由一个自定义UICollectionViewCell子类的UICollectionView。 电池的正确显示和通过烧制这种方法正确地响应用户的触摸:

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

Answer 1:

该类只告诉你的高亮度状态,但不改变外观。 你必须例如通过改变细胞的背景做编程。

细节的描述的CollectionView编程指南 。



Answer 2:

作为SAE说,你必须自己做一个子类。 其他的障碍我只是跑成是攻细胞时,它被接收的亮点,如果被按住的细胞重新划分。 但是,如果窃听快速重绘从来没有发生过。

我创造了细胞在故事板和收集视图具有“延时内容触摸”打勾作为默认值。 我取消选中这一点,它会立即显示在手指触摸屏幕。

我使用的是自定义绘制例程检查isHighlighted值。 您还需要重写自定义单元格如下setHighlighted或抽签程序不会被调用。

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


Answer 3:

有2种委托方法你应该实现:

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


Answer 4:

您需要实现UICollectionViewDataSource如果你想在触摸到具有亮点和Unhighlight效果和触摸释放

这里是示例代码

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


Answer 5:

你可以得到一个高亮通过添加这些行到你的UICellView的设置进行绘制。

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

从“管理的选择和亮点可视化状态” ......收集意见默认支持单项选择,并且可以配置为支持多个项目选择或具有完全禁用选择。 收集视图检测抽头其边界和亮点内或相应地选择对应的小区。 在大多数情况下,所述集合视图修改的小区的唯一的属性,以指示它被选择或高亮; 它不会改变你的细胞的视觉外观,但有一个例外。 如果一个细胞的selectedBackgroundView属性包含一个有效的视图,集合视图显示了当细胞被突出显示或选择了这一观点。



Answer 6:

作为SAE指出,你必须手动完成在彰显细胞。 我发现最简单的方法是使用的tableview didHighlightRowAtIndexPath和didUnhighlightRowAtIndexPath方法来设置一个布尔“强调”在您的UICollectionCell实例,然后覆盖在子类UICollectionCell类属性。 这样做的好处是,动画已经在你身边。 你也可以做同样的一个UITableView / UITableViewCell的情况。

因此,在使用UICollectionViewDelegate方法您UICollectionView:

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


Answer 7:

你可以试试下面的代码:

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


Answer 8:

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


Answer 9:

如果你想改变视觉效果,你可以将电池设置在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];
}


文章来源: Why UICollectionView's UICollectionViewCell is not highlighting on user touch?