15

ユーザーがドラッグアンドドロップできるUIViewがいくつかあります。UIPanGestureRecognizerを使用して d&d アクションを管理します (以下のコードを参照)。d&d アクションは正常に動作していますが、別の UIView のドラッグを開始すると、ドロップしたばかりの UIView が元の位置に戻ります。

- (void)handlePan:(UIPanGestureRecognizer *)recognizer {

    CGPoint translation = [recognizer translationInView:self.view];

    switch (recognizer.state) {
        case UIGestureRecognizerStateBegan:
            for (UIView* checkView in dragAndDropImageViewsArray) {
                if (checkView == recognizer.view) {
                    [checkView.superview bringSubviewToFront:checkView]; //this is done to make sure the currently dragged object is the top one
                }
            }
            break;

        case UIGestureRecognizerStateChanged:
            recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y);
            break;

        case UIGestureRecognizerStateEnded:
            NSLog(@"UIGestureRecognizerStateEnded");
            break;

        default:
            break;
    }

    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];

}

問題を「解決」したが、他の問題を引き起こしたいくつかのことを試しました。

  • 自動レイアウトのキャンセル: これで完全に解決しましたが、さまざまなデバイスや向きに合わせてオブジェクトの位置とサイズの計算と管理を開始する必要があります。
  • これにより、オブジェクトが他のオブジェクトの上に表示され、明らかに「ジャンプバック」が回避されますが、異なるドラッグ可能なオブジェクト間の階層を変更することはできません。

自動レイアウトについての理解を深め始めましたが、探しているものが非常に単純であるべきだと思われると、非常に複雑になります。「再自動レイアウト」の実行に対処する多くの方法を見ましたが、それらの操作方法については明確ではありません。

ここに簡単な解決策はありますか?IB Auto-Layout 制約をオーバーライドし、UIView の新しい位置に従ってそれらを再定義するメソッドを呼び出すようなものですか?

どんな支援も非常に高く評価されます。

4

2 に答える 2