4

UIButtonビューの1つにあるいくつかのインスタンスをタッチして画面上でドラッグできるようにしようとしています(最終的には勢いがありますが、それは後で行います!)。以下に示すように、これは非常に単純な形式で機能していますが、問題は、ボタンに触れてドラッグを開始すると、ボタンが指に付着し、指を離すと、「TouchUpInside」イベントがトリガーされることです。これは、実際にボタンをタップしたときに実行したいコードです。

一言で言えば、タップとドラッグ/リリースをどのように区別しますか?タップをショートタップジェスチャレコグナイザーなどに変更する必要がありますか?コード:

viewDidLoadの場合:

[firstButton addTarget: self action: @selector(wasDragged: withEvent:) forControlEvents: UIControlEventTouchDragInside];

そして私のwasDraggedメソッド:

- (void)wasDragged:(UIButton *)button withEvent:(UIEvent *)event
{
    if (button == letter1Button) {
        UITouch *touch = [[event touchesForView:button] anyObject];

        CGPoint previousLocation = [touch previousLocationInView:button];
        CGPoint location = [touch locationInView:button];
        CGFloat delta_x = location.x - previousLocation.x;
        CGFloat delta_y = location.y - previousLocation.y;

        button.center = CGPointMake(button.center.x + delta_x, button.center.y + delta_y);
    }
}
4

3 に答える 3

16

を使用してUIPanGestureRecognizer、ビュー内のタッチをキャンセルするように指示できます...

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIPanGestureRecognizer *panRecognizer;
    panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self
                                                            action:@selector(wasDragged:)];
    // cancel touches so that touchUpInside touches are ignored
    panRecognizer.cancelsTouchesInView = YES;
    [[self draggableButton] addGestureRecognizer:panRecognizer];

}

- (void)wasDragged:(UIPanGestureRecognizer *)recognizer {
    UIButton *button = (UIButton *)recognizer.view;
    CGPoint translation = [recognizer translationInView:button];

    button.center = CGPointMake(button.center.x + translation.x, button.center.y + translation.y);
    [recognizer setTranslation:CGPointZero inView:button];
}

- (IBAction)buttonWasTapped:(id)sender {
    NSLog(@"%s - button tapped",__FUNCTION__);
}
于 2012-11-22T12:22:29.380 に答える
2

私のような初心者のために、私UIPanGestureRecognizerは上記のように試しましたが、うまくいきませんでした。だから、これが私の簡単な解決策です:まず、Baigによって提案されたようにイベントリスナーを追加します:

// add drag listener
[button addTarget:self action:@selector(wasDragged:withEvent:) forControlEvents:UIControlEventTouchDragInside];
// add tap listener
[button addTarget:self action:@selector(wasTapped:) forControlEvents:UIControlEventTouchUpInside];

ドラッグとタップの両方がトリガーさUIControlEventTouchUpInsideれるので、次のようにフラグを追加しwasDragged:withEvent:ます。

-(IBAction)wasDragged: (id)sender withEvent: (UIEvent *) event {
    was_dragged = YES;
    UIButton *selected = (UIButton *)sender;
    selected.center = [[[event allTouches] anyObject] locationInView:self.view];
}

- (IBAction)buttonWasTapped:(id)sender {
    if(!was_dragged)
        NSLog(@"button tapped");
    else{
        was_dragged = NO;
        NSLog(@"button dragged");
    }
}

出来上がり。終わり。

于 2016-10-09T15:14:31.973 に答える
1

UIButtonのUIControlEventTouchDragInsideおよびUIControlEventTouchUpInsideイベントを次のように使用します。

// add drag listener
[button addTarget:self action:@selector(wasDragged:withEvent:) forControlEvents:UIControlEventTouchDragInside];
// add tap listener
[button addTarget:self action:@selector(wasTapped:) forControlEvents:UIControlEventTouchUpInside];

HBDraggableButtonコントロールを使用できます。

于 2013-10-11T14:15:54.533 に答える