UIScrollView不取消UIGestureRecognizer

时间:2014-01-28 10:26:27

标签: ios iphone cocoa-touch uitableview

我有一个UITableView,里面装满了照片缩略图按钮(很像照片应用)。这些按钮是自定义的,并使用UIButton实现与UILongPressGestureRecognizer相同的行为。

我想要发生的是,如果用户去滚动UITableView,如果他们的触摸在他们开始滚动时落在我的一个按钮上,我希望我的按钮取消触摸。我尝试在UITableView

中实施
self.delaysContentTouches = NO;
self.canCancelContentTouches = YES;

- (BOOL) touchesShouldCancelInContentView:(UIView *)view
{
    return YES;
} 

不起作用。我试过了:

[self.panGestureRecognizer requireGestureRecognizerToFail:self.thumbnailButtonView.longPressGestureRecognizer];

不起作用。有没有人知道如何实现这种行为?是否可以让UIScrollView取消UILongPressGestureRecognizer触摸?

1 个答案:

答案 0 :(得分:0)

实际上,我发现解决这个问题的方法不是试图让UIScrollView 取消按钮的触摸,但必须更改按钮的行为。

我创建了我的按钮,其行为与UIButton完全相同,所以如果按下它,它会突出显示。然后,如果您仍然按下手指时拖动手指,并在按钮框架中向上提起,则会触发按钮操作。我必须这样做,以便如果你在按下后拖动它,它会删除按钮高亮,从而防止如果用户在按钮区域提起手指时触发按钮动作。

下面的代码实际上是如何使用UILongPressGestureRecognizer以这种方式实现按钮:

- (void) longPress:(UILongPressGestureRecognizer *)longPressGestureRecognizer
{
    CGPoint touchedPoint = [longPressGestureRecognizer locationInView: self];

    if (longPressGestureRecognizer.state == UIGestureRecognizerStateBegan)
    {
        if (CGRectContainsPoint(self.bounds, touchedPoint))
        {
            [self addHighlights];
        }
        else
        {
            [self removeHighlights];
        }
    }
    else if (longPressGestureRecognizer.state == UIGestureRecognizerStateChanged)
    {
            if (self.highlightView.superview)
    {
        [self removeHighlights];
    }
    }
    else if (longPressGestureRecognizer.state == UIGestureRecognizerStateEnded)
    {
        if (self.highlightView.superview)
        {
            [self removeHighlights];

            if (CGRectContainsPoint(self.bounds, touchedPoint))
            {
                if ([self.delegate respondsToSelector:@selector(buttonViewDidTouchUpInside:)])
                {
                    [self.delegate buttonViewDidTouchUpInside:self];
                }
            }
        }
    }
}

- (void) addHighlights
{
    [self addSubview:self.highlightView];
}

- (void) removeHighlights
{
    [self.highlightView removeFromSuperview];
}