我有生成随机CGRect的代码,检查它是否与前一个数组中的任何其他rects相交,如果没有,则将新的rect添加到数组中。这非常好用,但我也想确保随机CGRect也不会与屏幕中心的图像重叠。我创建了一个矩形,勾勒出图像,两侧有足够的额外空间,但随机CGRects仍然不相互交叉,它们有时会与中心图像矩形相交。
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是一个较大的矩形,以确保没有任何随机因素离中心太远。
答案 0 :(得分:1)
为了说服读者CGRectIntersectsRect
无法正常工作,您需要提供一些证明其失败的NSLog证据。
代码看起来还不错,所以怀疑是我们在OP中看不到的东西:
aRandomX
和aRandomY
的计算。我认为看起来像这样:
CGFloat aRandomX = arc4random_uniform(someView.bounds.size.width);
CGFloat aRandomY = arc4random_uniform(someView.bounds.size.height);
someView 在这里非常重要:它是一个UIView
,其中包含所有这些rects的图片视图和坐标系,如果我们在视图中,可能会self.view
控制器
BOUNDARY
的值,但我敢打赌,这是一个简单的常量矩形,原点为零或小,且大小等于或小于someView
可能最险恶的罪魁祸首是imageRect
的坐标系。如果矩形和边界位于 someView 的坐标系中,那么必须是self.fixation
的中心属性。换句话说,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
作为旁注,你的循环有点浪费,因为它每次检查计算的rect时都会检查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
一起使用。祝你好运!