好的。我是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时(麻烦的是它也会导致前一行出错)。
更新:为了澄清,断点始终发生在colorV.center
通过之后调用的任何行上(无论我将行更改为什么)。例如,在我最近的测试中,断点突出显示了行CGRectContainsPoint
和NSLog(@"start");
,但没有像典型的错误消息那样打印到控制台。
大更新:现在让我惊讶的是,将CGRectContainsPoint更改回原来的工作,Thread 1: breakpoint 2.1,
现在无效。但是,不同之处在于程序在评估为CGRectContainsRece([overlapV frame], [colorV frame])
时不会中断;它只是保持运行,就像if语句永远不应该被调用。
答案 0 :(得分: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
看起来正确。如果事实证明确实存在问题,请发布一张图片,说明这应该是真实的。