iOS - 我如何知道我拖动的视图?

时间:2014-07-15 13:03:09

标签: ios objective-c uiview uiscrollview

我有一个UIScrollView填充了可拖动的(UIView) card作为子视图,我希望card重新组织自己(为用户腾出新的空间)将其中一个拖入UIScrollView

问题是:我怎么知道哪个UIViews在我拖动的那个下面?所以我可以得到它的索引并将其从被拖动的card移开?

我尝试使用hitTest:withEvent:,但我认为我做得还不够,因为它正在返回nil

UIView *viewUnderCard = [card hitTest:card.center withEvent:nil];

刚开始为iOS开发。有什么帮助吗?

3 个答案:

答案 0 :(得分:1)

获取触摸点,然后调用功能

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

对于所有UIScrollView子视图和函数将返回YES,如果提供CGPoint在其框架内。

答案 1 :(得分:1)

您已走上正确的轨道,可以使用hitTest:withEvent:。但@Mysiaq是正确的,pointInside:withEvent:可能更好。

您需要确保坐标相对于正确的视图。如果您使用card.center,则坐标系统是卡片的父视图。

代码看起来像这样:

UIView *container = viewThatHasAllTheCards;
UIView *targetCard = nil;
CGPoint cardInWindow = [draggedCard.superview convertPoint:draggedCard.center toView:nil];
CGPoint cardInContainer = [container convertPoint:cardInWindow fromView:nil];

for (UIView *subview in container.subviews) {
    if (subview == draggedCard) {
        // Skip the dragged card.
        continue;
    }

    if ([subview pointInside:cardInContainer withEvent:nil]) {
        targetCard = subview;
        // If you want the lower-most card, break here.
        // If you want the top-most card, do not break here.
    }
}

答案 2 :(得分:1)

您可以比较两个视图的边界值:

CGRect boundsView1 = [view1 convertRect:view1.bounds toView:nil];
CGRect boundsView2 = [view2 convertRect:view2.bounds toView:nil];
Boolean viewsOverlap = CGRectIntersectsRect(boundsView1, boundsView2);

从这里开始,你应该能够弄清楚如何在你的视图列表中有效地迭代,以确定是否有重叠。