7

iOS を学習していますが、ドラッグ アンド ドロップの動作を に追加する方法が見つかりませんUIView

私は試した:

[_view addTarget:self action:@selector(moved:withEvent:) forControlEvents:UIControlEventTouchDragInside];

UIView宣言セレクターの可視インターフェイスがありません」と表示されますaddTarget (etc)

また、パンジェスチャ認識機能を追加しようとしましたが、それが必要かどうかはわかりません

- (IBAction)test:(id)sender {
       NSLog(@"dfsdfsf");
  }

呼び出されますが、イベントの座標を取得する方法がわかりません。移動イベントのコールバックを登録する/ドラッグアンドドロップを行うiOSの標準的で簡単な方法は何ですか?

前もって感謝します。

4

2 に答える 2

15

AUIPanGestureRecognizerは間違いなく行く方法です。ユーザーにビューをドラッグしてもらいたい場合は、スーパービューの座標系でジェスチャの「移動」(移動) が必要になります。

- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer {
    CGPoint translation = [recognizer translationInView:_view.superview];

翻訳が完了したら、次のように変更してビューを移動 (「ドラッグ」) できますcenter

    CGPoint center = _view.center;
    center.x += translation.x;
    center.y += translation.y;
    _view.center = center;

最後に、パン ジェスチャ レコグナイザの変換を 0 に戻して、次回メッセージを受け取ったときに、最後のメッセージからジェスチャが移動した量だけを通知するようにします。

    [recognizer setTranslation:CGPointZero inView:_view.superview];
}

ここでは、簡単にコピー/貼り付けできるようにすべてまとめています。

- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer {
    CGPoint translation = [recognizer translationInView:_view.superview];

    CGPoint center = _view.center;
    center.x += translation.x;
    center.y += translation.y;
    _view.center = center;

    [recognizer setTranslation:CGPointZero inView:_view.superview];
}
于 2012-11-12T22:31:09.320 に答える
4

touchesBegan、 、touchesMovedで開始しtouchesEndedます。UIView サブクラスでこれらをオーバーライドすると、イベント システムを学習することができます。次のようにイベント座標を取得できます。

- (void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event
{
    float x = [[touches anyObject] locationInView:self].x;
    float y = [[touches anyObject] locationInView:self].y;
}

次に、異なるビュー間で座標を変換するためのものがたくさんあります。それを理解したら、UIGestureRecognizerすでに見つけた必要なものを操作できます。

ドラッグ/ドロップを行うには、パン ジェスチャ レコグナイザが必要です。locationInView:でセレクターを使用してUIPanGestureRecognizer、特定の瞬間に自分がどこにいるかを知ることができます。

しようとしていたターゲットアクションのものではなく、次のようにジェスチャレコグナイザーを追加します。

UIPanGestureRecognizer *dragDropRecog = [[UIPanGestureRecognizer alloc] initWithTarget:yourView action:@selector(thingDragged:)];
[yourView addGestureRecognizer:dragDropRecog];

thingDragged:次に、ビューにセレクターを実装する必要があります。

- (void) thingDragged:(UIPanGestureRecognizer *) gesture
{
    CGPoint location = [gesture locationInView:self];
    if ([gesture state] == UIGestureRecognizerStateBegan) {
        // Drag started
    } else if ([gesture state] == UIGestureRecognizerStateChanged) {
        // Drag moved
    } else if ([gesture state] == UIGestureRecognizerStateEnded) {
        // Drag completed
    }
}

変更されたビットでドラッグされているビューを翻訳し、終了セクションでドロップを処理します。

于 2012-11-12T22:25:49.333 に答える