我有一个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触摸?
答案 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];
}