Objective c 为什么CGRectContainsPoint在确定两个视图之间的重叠时会导致错误?

Objective c 为什么CGRectContainsPoint在确定两个视图之间的重叠时会导致错误?,objective-c,cgrect,cgpoint,Objective C,Cgrect,Cgpoint,好的。我是objective-c新手,我正在尝试检测两个重叠的视图。我最初使用的是CGRectContainsRect(它工作得很好),但我注意到,即使视图几乎没有重叠,它也会调用true。但是,由于视图很小,我只希望在它们严重重叠时条件为真。因此,我尝试使用CGRectContainsPoint,其中我检查的点是第二个视图的中心 做这个改变给我带来了一些问题。以下是我的整个if语句(尽管我已将问题隔离到cRectContainsPoint部分: NSDictionary *dictInQ =

好的。我是objective-c新手,我正在尝试检测两个重叠的视图。我最初使用的是
CGRectContainsRect
(它工作得很好),但我注意到,即使视图几乎没有重叠,它也会调用true。但是,由于视图很小,我只希望在它们严重重叠时条件为真。因此,我尝试使用
CGRectContainsPoint
,其中我检查的点是第二个视图的中心

做这个改变给我带来了一些问题。以下是我的整个if语句(尽管我已将问题隔离到
cRectContainsPoint
部分:

NSDictionary *dictInQ = masterDict[n];
UIView *overlapV = dictInQ[@"view"];
NSNumber *overlapB = dictInQ[@"hiddenBool"];
//if it's not itself and they intersect and they are in the same column and both views are not hidden
if (overlapV != colorV && CGRectContainsPoint([overlapV frame], CGPointMake(colorV.center.x, colorV.center.y)) && startLocation == overlapV.frame.origin.x && [colorB intValue]!=1 && [overlapB intValue]!=1)
最初,当我使用
CGRectContainsRect
时,我使用了
[overlapV frame]
[colorV frame]。
现在我尝试使用
overlapV
视图并检查它是否包含视图中心
colorV。
我尝试替换
CGPointMake(colorV.center.x,colorV.center.y)
使用
colorV.center
无效,我已经阅读了关于CGRectContainsPoint和CGPointMake的文档,并研究了类似的问题

真正让我困惑的是,这个if语句行没有显示错误。它编译得很好,当CGRectContainsPoint应该从模拟器计算true时,Xcode的错误指向if语句中执行的第一行(虽然这一行也不是导致问题的原因;我试着对它进行注释,但它只是在下一行引发了错误)。您对这一问题的原因有何想法

更新:这里是视图的屏幕截图,重叠程度足以导致CGRectContainsPoint正确计算为true(问题是它还会导致下一行出错)

Update:为了澄清,断点总是发生在
CGRectContainsPoint
通过后调用的任何行上(无论我将行更改为什么)。例如,在我最近的测试中,断点突出显示了行
NSLog(@“start”);
并说
线程1:Breakpoint2.1,
,但没有像典型的错误消息那样输出到控制台

大更新:现在令我惊讶的是,将CGRectContainsPoint更改回原来的,
CGRectContainsRece([overlav frame],[colorV frame])
现在不起作用。但是,区别在于,当程序的计算结果应为
True
时,程序不会中断;它只是保持运行,就像永远不应该调用if语句一样。

编辑
我想我错过了你前面问题的要点。断点不是错误,只是暂停程序执行的一种方式,这样你可以查看内存并逐行遍历程序。要消除断点,只需单击代码行左侧的断点符号:

或者您可以单击底部的“继续程序执行”按钮:

原始答案:
为了简化调试,我建议您重新编写if语句,如下所示:

if (overlapV != colorV)
{
    // CGPointMake is not required here because a view's center is already a CGPoint.
    // Note that it won't cause a problem, it just isn't needed.
    if (CGRectContainsPoint([overlapV frame], colorV.center))
    {
        if (startLocation == overlapV.frame.origin.x)
        {
            if ([colorB intValue] != 1)
            {
                if ([overlapB intValue] != 1)
                {
                    // All are true
                }
            }
        }
    }
}

现在,您可以一次浏览一行,确定哪一行是问题所在。不过,
CGRectContainsPoint
看起来不错。如果它确实是问题所在,请发布一张图片,说明当返回真值时视图的样子。

感谢您的回复。我在您设计时扩展了If语句演示,断点再次指向
CGRectCointainsPoint
检查后的任何一行(我将这一行更改为简单的
NSLog(@“start”);
,它仍然是断点)。但是,此检查显然有效;当视图的重叠程度不足以使一个中心与另一个视图相交时,则没有问题,sim将按预期继续运行。我已更新帖子,在语句正确计算为true时,添加相交视图的照片,但会导致错误。感谢您的更新。确实如此,成功了!我现在不明白为什么CGRECT CONTAINSRECT不再有效,但如果J无法通过我自己的努力找到解决方案,我将提出一个新问题。你所说的“问题是它也会在进行过程中导致错误”是什么意思你在画圆圈吗?还是它们是图像?展示你的图片breakpoints@lnafzigerXcode将断点显示为直接在
CGRectContainsPoint
检查返回true之后的objective-c的任何一行。在我回答的屏幕截图中,断点指向“``NSLog(@“start”);```(这没有错)@uchuugaka这些圆是从视图中绘制的。我对每个视图使用
view.layer.cornerRadius=20.0;
。我已经更新了我的答案,以包含断点。