如何以编程方式确定是否发生了“touchUpInside”事件?

时间:2009-05-22 20:00:18

标签: iphone cocoa-touch uikit

似乎每次用户触摸我的视图时都会调用此方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if ([touch view] == self && [touch tapCount] >= 1) {
        // do something...
    }
}

我在UIScrollView中实现了它。 UIEvent的文档没有提到在连接到操作方法时Interface Builder中可用的touchUpInside,touchUpOutside等事件。

实际上我希望只在其中一个“touchUpInside”事件中调用方法,而不是任何触摸。

5 个答案:

答案 0 :(得分:3)

你想要touchesEnded:withEvent:。当在UIResponder内开始触摸或一系列触摸时,会调用touchesBegan方法;当完成一批触摸时(即用户停止触摸屏幕/抬起手指),touchesEnded方法被调用。

答案 1 :(得分:1)

规范的方法是创建一个IBAction并将其连接到InterfaceBuilder.app中的touchUpInside事件。

一旦touchUpInside发生,您的IBAction将被调用。

如果您在IB之外以编程方式创建,您仍然可以连接IBAction。

答案 2 :(得分:1)

这就是我将IBAction链接到文本字段的方式:

[yourTextField addTarget:self action:@selector(your method:) forControlEvents:UIControlEventTouchUpInside];

答案 3 :(得分:0)

Vadoff的技术很整洁,但不要忘记通过调用超级功能来清理触摸事件。这是完整的代码。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    BOOL touchedUpInside = NO;
    if (self.isTouchUpInside) {
        touchedUpInside = YES;
    }

    [super touchesEnded:touches withEvent:event];    

    if (touchedUpInside) {
        // touched up inside
    } 
}

答案 4 :(得分:0)

摘自UIControlEventTouchUpInside的文档。

  

控件中的触摸事件,手指处于控件的边界之内。

AFAICS,您需要实现touchesEnded:withEvent:


    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

        if let point = touches.first?.location(in: self), self.point(inside: point, with: event) {
            //didTouchUpInside
        }
    }
  

如果您在不调用super的情况下重写此方法(通常使用的模式),则即使您的实现不执行任何操作,也必须重写其他方法来处理触摸事件。