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 回答
0

您可以通过使用来实现这一点 CGRectIntersectsRect(<#CGRect rect1#>, <#CGRect rect2#>)

于 2016-07-14T13:29:39.653 回答