2

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

我需要一种方法来防错,以便在 a 之后TouchDownTouchUpInside如果手指在以下情况下执行代码:a)抬起按钮,b)拖离按钮,或 c)以其他方式取消。

a) 由 解决UIControlEventTouchUpInside,并且我都尝试了UIControlEventTouchDragExitand UIControlEventTouchUpOutside,但我无法解决 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

4 回答 4

5

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

编辑:

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

并将标志设置为 YES Before

于 2013-01-15T13:29:59.750 回答
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];
于 2013-01-15T12:49:23.393 回答
0

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

对于 b),我认为 UIControlEventTouchDragExit 应该可以工作,我已经尝试过它并且它可以正常工作,请确保您已正确连接 IBAction。

于 2013-01-15T12:51:22.173 回答
0

回答你的观点

b) 拖掉按钮,你需要使用UIControlEventTouchDragOutside

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

像这样:

[newBall.button addTarget:self action:@selector(someMethod:withEvent: )
              forControlEvents: UIControlEventTouchCancel | UIControlEventTouchDragOutside];
于 2015-10-25T00:06:01.680 回答