2

UIButtonイベントに対して異なるコードを実行するインスタンスがいくつかUIControlEventTouchDownありUIControlEventTouchUpInsideます。現時点では、ユーザーがタッチダウンした後、UIButtonタッチアップする前に指をの境界からドラッグすると、TouchUpInsideコードが実行されないため、次のコードがTouchDownクラッシュするという問題が発生しています。

これをエラー防止する方法が必要です。これにより、aの後、指がa)ボタンの上に持ち上げられた場合、b)ボタンからドラッグされた場合、またはc)他の方法でキャンセルされた場合TouchDownに、コードが実行されます。TouchUpInside

a)はによって解決され、との両方をUIControlEventTouchUpInside試しましたが、状況b)またはc)を解決できません。UIControlEventTouchDragExitUIControlEventTouchUpOutside

これをどのように処理できるか考えていますか?これが私のコードです:

[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に設定する前に

于 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 に答える