当我在我的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:
不再有效。
答案 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
}
}