3

パンジェスチャを使用して、ドラッグラインでマルチビューをドラッグします。iOS-ドラッグアンドドロップの衝突検出選択したアイテムが別のサブビュー上にドラッグされたことを検出するにはどうすればよいですか?

私のコード:

- (void)viewDidLoad
{
    [super viewDidLoad];
    for (UIView *aView in self.view.subviews) {
        [self addGestureRecognizersToPiece:aView];
    }
}

- (void)addGestureRecognizersToPiece:(UIView *)piece
{
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panPiece:)];
    [piece addGestureRecognizer:panGesture];
}



- (void)panPiece:(UIPanGestureRecognizer *)gestureRecognizer
{
    CGPoint dragingPoint = [gestureRecognizer locationInView:self.view];

    for (UIView *aView in self.view.subviews) {
        if (CGRectContainsPoint([aView frame], dragingPoint)) {
                aView.center = dragingPoint;
        }
    }

}

サブビューが非常に多いので、self.view内のすべてのサブビューをループさせたくはありません。ドラッグラインで一致するビューを検出したいだけです。どうやってするか?

[gestureRecognizerビュー]を使用すると、最初のビューが表示されます。

よろしくお願いします!

4

3 に答える 3

5

より単純なコードが必要な場合は、UIView のhitTest:withEvent:メソッドを使用して、タッチ位置でビューを見つけることができます。

- (void)panPiece:(UIPanGestureRecognizer *)gestureRecognizer
{
    CGPoint draggingPoint = [gestureRecognizer locationInView:self.view];
    UIView *hitView = [self.view hitTest:draggingPoint withEvent:nil];
    if (hitView.superview == self.view)
        hitView.center = draggingPoint;
}

これは、サブビュー自体に (インタラクティブな) サブビューがないことを前提としています。

于 2013-02-15T09:14:45.330 に答える
1

そこにあるのは、最良の (つまり、最も単純な) アプローチです。パフォーマンスの問題に気付いていない限り、心配する必要はありません。

改善できる点がいくつかあります。

  1. 特定のビューのみに関心がある場合 (ドラッグしている行にあるビューについて言及していますが、それが何であるかはわかりません)、開始する前にそれらのビューを配列に追加し、その配列をループします。
  2. ターゲットを見つけたら ( を使用してbreak;) ループから抜け出します。
  3. 最後にヒットしたビューを保存し、最初に確認します。多くの場合、メソッドが最後に呼び出されたときから変更されていません。
于 2013-02-15T07:34:47.917 に答える