如何在touchesBegan,touchesEnded中实现Touch Up Inside

时间:2012-10-11 00:40:28

标签: iphone ios cocoa-touch uigesturerecognizer

我想知道当用户按下然后用touchesBegantouchesEnded方法抬起手指时,是否有人知道如何实现“内部修饰”响应。我知道这可以通过UITapGestureRecognizer来完成,但实际上我正在尝试将其设置为仅在快速点击时使用UITapGestureRecognizer,如果您长时间握住手指,然后举起,它仍然执行)。有谁知道如何实现这个?

6 个答案:

答案 0 :(得分: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];
            }
        }
    }
}

答案 1 :(得分:2)

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

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

答案 2 :(得分: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])
        {

        }
    }

答案 3 :(得分:1)

我不确定何时添加该属性,但是属性isTouchInside是否可以保存任何UIControl派生对象(例如UIButton)的生命。

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

这里是Apple official docs

答案 4 :(得分:0)

您可以在BOOL中创建一些-touchesBegan变量,查看您需要触摸的视图或其他内容,并将此BOOL变量设置为YES。在-touchesEnded之后,检查此变量是否为YES,并且您的视图或您需要的任何内容都会被触及-touchUpInside。当然,在{。}之后将BOOL变量设置为NO

答案 5 :(得分:0)

您可以添加UTapGestureRecognizerUILongPressGestureRecognizer并使用[tap requiresGestureRecognizerToFail:longPress];添加相关性(点击并长按是添加的识别器的对象)。

这样,如果长按,则不会检测到水龙头。