CGRectIntersectsRect 工作不一致
Posted
技术标签:
【中文标题】CGRectIntersectsRect 工作不一致【英文标题】:CGRectIntersectsRect working inconsistently 【发布时间】:2016-09-02 17:57:53 【问题描述】:我有生成随机 CGRect 的代码,检查它是否与前一个数组中的任何其他矩形相交,如果不相交,则将新矩形添加到数组中。这工作得很好,但是我还想确保随机 CGRect 也不会与屏幕中心的图像重叠。我创建了一个矩形,它在图像的两侧有足够的额外空间来勾勒出图像的轮廓,但是虽然随机的 CGRect 仍然不会相互交叉,但它们有时会与中心图像矩形相交。
CGRect aRandomFrame = CGRectMake((aRandomX - 50), (aRandomY - 50), 100, 100);
CGRect imageRect = CGRectMake((self.fixation.center.x - 50), (self.fixation.center.y - 50), 100, 100);
if (CGRectContainsRect(BOUNDARY, aRandomFrame))
BOOL isValidFrame = YES;
for (NSValue *aFrameValue in [self points])
CGRect aFrame = [aFrameValue CGRectValue];
if (CGRectIntersectsRect(aFrame, aRandomFrame) || CGRectIntersectsRect(imageRect, aRandomFrame))
isValidFrame = NO;
break;
if (isValidFrame)
[[self points] addObject:[NSValue valueWithCGRect:aRandomFrame]];
作为旁注,BOUNDARY 是一个较大的矩形,以确保没有一个随机矩形离中心太远。
【问题讨论】:
【参考方案1】:为了让读者相信CGRectIntersectsRect
不起作用,您需要提供一些 NSLog 证据表明它失败了。
代码看起来不错,所以怀疑是我们在 OP 中看不到的东西:
aRandomX
和 aRandomY
的计算。我想这看起来像这样:
CGFloat aRandomX = arc4random_uniform(someView.bounds.size.width);
CGFloat aRandomY = arc4random_uniform(someView.bounds.size.height);
someView在这里很重要:它是一个UIView
,包含所有这些矩形的图像视图和坐标系,如果我们在视图控制器中,可能是self.view
BOUNDARY
的值,但我敢打赌这是一个简单的常量矩形,原点为零或较小,大小等于或略小于someView
可能也是最险恶的罪魁祸首是imageRect
的坐标系。如果矩形和边界在 someView 的坐标系中,那么self.fixation
的 center 属性也必须如此。换句话说,self.fixation
必须是someView
的直接子视图。
无论它如何与视图层次结构中的 someView 相关,您都可以通过使用稍微复杂的方法来确保 imageRect
是正确的:
CGRect imageRect = [self.fixation convertRect:self.fixation.bounds toView:someView];
// remember someView might be self.view in a view controller
// what to do here depends on how your view hierarchy relates to the rects
附带说明一下,您的循环有点浪费,因为每次检查计算的矩形与保存的矩形时,它都会检查 imageRect。你可以这样解决:
if (CGRectContainsRect(BOUNDARY, aRandomFrame))
if (!CGRectIntersectsRect(imageRect, aRandomFrame))
BOOL isDisjoint = YES;
for (NSValue *frameValue in self.points)
CGRect aFrame = [frameValue CGRectValue];
if (CGRectIntersectsRect(aFrame, aRandomFrame))
isDisjoint = NO;
break;
if (isDisjoint)
[self.points addObject:[NSValue valueWithCGRect:aRandomFrame]];
这样做的另一个好处是调试:打破第二个条件并检查aRandomFrame
是否与imageRect
相交。如果是这样,NSLog 矩形并将它们张贴在这里。你会发现CGRectContainsRect
有一个错误,但它没有,我敢肯定。
相反,如果您发现矩形在该点不相交,并且如果有任何问题,则将与imageRect
相交。祝你好运!
【讨论】:
抱歉这个回复太晚了,其他事情需要我注意,这被搁置了。但是我实现了您提出的内容,它帮助我解决了一些问题,所以谢谢!以上是关于CGRectIntersectsRect 工作不一致的主要内容,如果未能解决你的问题,请参考以下文章
在 CGRectIntersectsRect 中的调用错误中缺少参数 #2
通过 CGRect Intersects Rect 过滤 ns 可变数组