我有一个UIScrollView
填充了可拖动的(UIView)
card
作为子视图,我希望card
重新组织自己(为用户腾出新的空间)将其中一个拖入UIScrollView
。
问题是:我怎么知道哪个UIViews
在我拖动的那个下面?所以我可以得到它的索引并将其从被拖动的card
移开?
我尝试使用hitTest:withEvent:
,但我认为我做得还不够,因为它正在返回nil
。
UIView *viewUnderCard = [card hitTest:card.center withEvent:nil];
刚开始为iOS开发。有什么帮助吗?
答案 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);
从这里开始,你应该能够弄清楚如何在你的视图列表中有效地迭代,以确定是否有重叠。