3

我想知道当用户按下然后在touchesBegan,touchesEnded方法中抬起手指时,是否有人知道如何实现“内部修饰”响应。我知道这可以用 来完成 UITapGestureRecognizer,但实际上我正在尝试让它只在快速点击时起作用(用UITapGestureRecognizer,如果你把你的手指放在那里很长时间,然后抬起,它仍然会执行)。有人知道如何实现吗?

4

6 回答 6

4

使用实际是模仿( , , , 等)UILongPressGesturizer的所有功能的更好的解决方案:UIButtontouchUpInsidetouchUpOutsidetouchDown

- (void) longPress:(UILongPressGestureRecognizer *)longPressGestureRecognizer
{
    if (longPressGestureRecognizer.state == UIGestureRecognizerStateBegan || longPressGestureRecognizer.state == UIGestureRecognizerStateChanged)
    {

        CGPoint touchedPoint = [longPressGestureRecognizer locationInView: self];

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

        CGPoint touchedPoint = [longPressGestureRecognizer locationInView: self];

        if (CGRectContainsPoint(self.bounds, touchedPoint))
        {
            if ([self.delegate respondsToSelector:@selector(buttonViewDidTouchUpInside:)])
            {
                [self.delegate buttonViewDidTouchUpInside:self];
            }
        }
    }
}
于 2014-02-19T04:20:02.953 回答
2

您可以通过创建 UIView 子类并在那里实现它来实现 touchesBegan 和 touchesEnded。

但是,您也可以使用UILongPressGestureRecognizer并获得相同的结果。

于 2012-10-11T00:44:30.003 回答
2

我通过放置一个在 touchesBegan 中触发的计时器来做到这一点。如果在调用 touchesEnded 时此计时器仍在运行,则执行您想要的任何代码。这给出了 touchUpInside 的效果。

  -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        NSTimer *tapTimer = [[NSTimer scheduledTimerWithTimeInterval:.15 invocation:nil repeats:NO] retain];
        self.tapTimer = tapTimer;
        [tapTimer release];
    }

    -(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    {
        if ([self.tapTimer isValid])
        {

        }
    }
于 2012-10-15T23:25:14.397 回答
2

我不确定它是什么时候添加的,但该属性是任何派生对象(例如)isTouchInside的救命稻草。UIControlUIButton

override func endTracking(_ touch: UITouch?, with event: UIEvent?) {
    super.endTracking(touch, with: event)
    if isTouchInside {
        // Do the thing you want to do
    }
}

这是苹果官方文档

于 2019-02-12T06:21:16.943 回答
0

您可以创建一些BOOL变量,然后-touchesBegan检查触摸了什么视图或您需要的任何内容,并将此BOOL变量设置为YES. 之后-touchesEnded检查这个变量是否是YES你的视图或你需要的任何东西被触及,这将是你的-touchUpInside. 当然,将BOOL变量设置为NO之后。

于 2012-10-11T01:05:02.627 回答
0

您可以添加 aUTapGestureRecognizer和 aUILongPressGestureRecognizer并使用添加依赖项[tap requiresGestureRecognizerToFail:longPress];(点击和长按是添加识别器的对象)。

这样,如果长按被触发,将不会检测到点击。

于 2012-10-11T02:35:55.803 回答