集合视图上的UILongPressGestureRecognizer会破坏单元格突出显示

时间:2015-11-10 14:51:02

标签: ios objective-c uicollectionview uigesturerecognizer

当我在我的collectionView上添加UILongPressGestureRecognizer时(我在this answer中执行此操作),集合视图会停止按预期突出显示单元格。

我正在处理我的UICollectionViewCellSubclass中的单元格突出显示,就像它在this answer中所解释的那样:

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];

    if (self.highlighted) {
        //Here I show my highlighting layer
    }
    else {
        //Here I hide my highlighting layer   
    }
}

- (void)setHighlighted:(BOOL)highlighted
{
    [super setHighlighted:highlighted];
    [self setNeedsDisplay]; //This call draw rect and show/hide the highlighting layer
}

问题似乎是,当我在集合视图上添加UILongPressGestureRecognizer手势时,在设置突出显示为YES后没有调用drawRect。

如果我移动逻辑以在setHighlighted:YES中显示我的突出显示层,我看不到触摸反馈,因为setHighlighted:NO之后会立即调用它! (只有在添加UILongPressGestureRecognizer)后才会发生这种情况。

我还尝试在touchesBegan / touchesEnded中移动逻辑,但后来didSelectRowAtIndexPath:不再有效。

1 个答案:

答案 0 :(得分:0)

不幸的是,看起来UILongPressGestureRecognizer阻止了UICollectionView突出显示单元格所需的触摸。它看起来并不像是有一种转发触摸的好方法,所以我想你必须手动处理高亮显示才能显示。您可以通过与setHighlighted不同的方法来完成,或尝试使用cell.highlighted属性来绘制。

这是我想出的一个适用于我的UICollectionView

的例子
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
//    if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
//        return;
//    }
    CGPoint p = [gestureRecognizer locationInView:self.collectionView];

    NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:p];
    if (indexPath == nil){
        NSLog(@"couldn't find index path");
    } else {
        // get the cell at indexPath (the one you long pressed)
        UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:indexPath];
        if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
            if (!cell.highlighted) {
                [cell setHighlighted:YES];
            }
            return;
        }
        [cell setHighlighted:NO];
        // do stuff with the cell
    }
}