在触摸之前,TouchDown离开控件后检测手指

时间:2013-01-15 12:39:48

标签: ios objective-c cocoa-touch touch-event uicontrolevents

我有一些UIButton个实例在UIControlEventTouchDownUIControlEventTouchUpInside个事件上执行不同的代码。目前我遇到了一个问题,如果用户降落,然后在触摸之前将他们的手指拖出UIButton的边界,TouchUpInside代码不会运行,因此,下一个TouchDown导致崩溃。

我需要一种方法来对此进行防错,以便在TouchDown之后,如果手指是:a)执行TouchUpInside代码,则执行以下操作:a)按下按钮,b)拖出按钮,或c)以其他方式取消。

a)由UIControlEventTouchUpInside解决,我尝试了UIControlEventTouchDragExitUIControlEventTouchUpOutside,但我无法解决情况b)或c)。

知道如何处理这件事吗?这是我的代码:

[newBall.button addTarget: self action: @selector(buttonDown:) forControlEvents: UIControlEventTouchDown];
[newBall.button addTarget: self action: @selector(buttonUp:) forControlEvents: UIControlEventTouchUpInside];

- (void) buttonDown: (id) sender
{
    NSLog(@"Finger down on button %d!", [sender tag]);

    int senderTag = [sender tag];

    for (CBBall *i in balls) {
        int currentTag = [i.button tag];
        if (currentTag == senderTag) {
            i.body -> f = cpvzero;
            [i replaceDynamicBall: i withStaticOneAtLocation: cpBodyGetPos(i.body)];
            [i setIsBeingTouched: YES];
        }
    }
}

- (void) buttonUp: (id) sender
{
    NSLog(@"Finger up on button %d!", [sender tag]);

    int senderTag = [sender tag];

    for (CBBall *i in balls) {
        int currentTag = [i.button tag];
        if (currentTag == senderTag) {
            [i replaceStaticBall: i withDynamicOneAtLocation: cpBodyGetPos(i.body)];
            [i setIsBeingTouched: NO];
        }
    }
}

4 个答案:

答案 0 :(得分:5)

设置UIControlEventAllTouchEvents的目标,然后在目标方法中检查isTracking UIbutton属性的值 这将解决您的问题。

编辑:

if([btn isTracking])
{
    if(flag)
    {
       flag=NO;
       //Your TouchDown Code
    }
}
else
{
   flag=YES;
   //your Touch Cancel and Exit code
}

并将标志设置为YES

答案 1 :(得分:0)

为您需要的所有事件设置相同的目标。

[btn addTarget:self action:@selector(yourMethodtoHandleTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];
[btn addTarget:self action:@selector(yourMethodtoHandleTouchUpInside:) forControlEvents:UIControlEventTouchDragOutside];
[btn addTarget:self action:@selector(yourMethodtoHandleTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];

答案 2 :(得分:0)

对于取消触摸,您可以使用UIControlEventTouchCancel。

对于b),我认为UIControlEventTouchDragExit应该可以工作,我已经尝试过它的工作,确保你已经正确连接了IBAction。

答案 3 :(得分:0)

回答你的观点

b)拖离按钮,您需要使用UIControlEventTouchDragOutside

c)以其他方式取消,您需要使用UIControlEventTouchCancel

因此:

[newBall.button addTarget:self action:@selector(someMethod:withEvent: )
              forControlEvents: UIControlEventTouchCancel | UIControlEventTouchDragOutside];