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

时间:2013-07-26 01:45:22

标签: objective-c cgrect cgpoint

好的。我是objective-c的新手,我试图检测两个重叠的视图。我最初使用CGRectContainsRect(效果很好),但注意到即使视图几乎不重叠,这也称为true。但是,由于视图很小,我只希望条件在重叠时才为真。所以,我试图使用CGRectContainsPoint代替,我检查的点是第二个视图的中心。

进行此更改会给我带来一些问题。这是我的整个if语句(虽然我已将问题隔离到CGRectContainsPoint部分:

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视图并检查它是否包含视图中心{{1我已经尝试用colorV.替换CGPointMake(colorV.center.x, colorV.center.y)无效,我已经阅读了有关CGRectContainsPoint和CGPointMake的文档并检查了类似的问题。

让我感到困惑的是,这条if语句行没有显示错误。它编译得很好,当CGRectContainsPoint应该从模拟器中评估为true时,Xcode的错误指向if语句中执行的第一行(虽然这条线也不是导致问题的原因;我试着将它注释掉它只是提高了而在下一行的错误)。关于可能导致这种情况的任何想法?

更新:这里是视图的截图,当重叠足以导致CGRectContainsPoint正确评估为true时(麻烦的是它也会导致前一行出错)。

Update: here is a screenshot of the views when overlapping enough to cause the CGRectContainsPoint to correctly evaluate to true (the trouble is that it also causes an error on the proceeding line).

更新:为了澄清,断点始终发生在colorV.center通过之后调用的任何行上(无论我将行更改为什么)。例如,在我最近的测试中,断点突出显示了行CGRectContainsPointNSLog(@"start");,但没有像典型的错误消息那样打印到控制台。

大更新:现在让我惊讶的是,将CGRectContainsPoint更改回原来的工作,Thread 1: breakpoint 2.1,现在无效。但是,不同之处在于程序在评估为CGRectContainsRece([overlapV frame], [colorV frame])时不会中断;它只是保持运行,就像if语句永远不应该被调用。

1 个答案:

答案 0 :(得分:1)

修改
我想我早些时候错过了你问题的要点。断点不是错误,而只是暂停程序执行的一种方法,这样您就可以查看内存并逐行逐步执行程序。要摆脱它,只需单击包含它的代码行左侧的断点符号:

enter image description here

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

enter image description here

原文回答:
为了使调试更容易,我建议你重写这样的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看起来正确。如果事实证明确实存在问题,请发布一张图片,说明这应该是真实的。