0

好吧。我是objective-c的新手,我正在尝试检测两个重叠的视图。我最初使用过CGRectContainsRect(效果很好),但注意到即使视图几乎没有重叠,这也是正确的。但是,由于视图很小,我只希望在它们严重重叠的情况下条件为真。所以,我尝试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视图并检查它是否包含colorV.我尝试替换CGPointMake(colorV.center.x, colorV.center.y)无济于事colorV.center的视图中心,并且我已经阅读了有关 CGRectContainsPoint 和 CGPointMake 的文档并检查了类似的问题。

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

更新:这里是视图的屏幕截图,当重叠程度足以导致 CGRectContainsPoint 正确评估为 true 时(问题是它也会导致后续行出现错误)。

更新:这里是视图的屏幕截图,当重叠程度足以导致 CGRectContainsPoint 正确评估为 true 时(问题是它也会导致后续行出现错误)。

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

大更新:现在令我惊讶的是,将 CGRectContainsPoint 更改回原来的工作,CGRectContainsRece([overlapV frame], [colorV frame])现在不起作用。True但是,不同之处在于程序在评估为;时不会中断。它只是继续运行,就像永远不应该调用的 if 语句一样。

4

1 回答 1

1

编辑
我认为我之前错过了您问题的要点。断点不是错误,而只是暂停程序执行的一种方法,以便您可以查看内存并逐行执行程序。要摆脱它,只需单击包含它的代码行左侧的断点符号:

在此处输入图像描述

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

在此处输入图像描述

原始答案:
为了使调试更容易,我建议您重新编写 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不过看起来是对的。如果事实证明确实是问题所在,请张贴一张应该返回 true 时视图的样子的图片。

于 2013-07-26T03:07:22.327 回答