gpt4 book ai didi

ios - CGRectIntersectsRect 工作不一致

转载 作者:行者123 更新时间:2023-11-29 00:41:49 26 4
gpt4 key购买 nike

我有代码生成一个随机 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 是一个较大的矩形,以确保没有任何随机矩形距离中心太远。

最佳答案

为了让读者相信 CGRectIntersectsRect 没有工作,您需要提供一些 NSLog 证据来证明它失败了。

代码看起来没问题,所以怀疑是我们在 OP 中看不到的东西:

  1. aRandomXaRandomY 的计算。我认为它看起来像这样:

    CGFloat aRandomX = arc4random_uniform(someView.bounds.size.width);
    CGFloat aRandomY = arc4random_uniform(someView.bounds.size.height);

someView 在这里很重要:它是一个 UIView 包含 ImageView 和所有这些矩形的坐标系,可能是 self.view 如果我们在 View Controller 中

  1. BOUNDARY 的值,但我敢打赌这是一个简单的常量矩形,原点为零或较小,大小等于或略小于 someView

  2. 可能的罪魁祸首是 imageRect 的坐标系。如果矩形和边界在 someView 的坐标系中,那么 self.fixation 的中心属性也必须如此。换句话说,self.fixation 必须是 someView 的直接 subview 。

无论它如何与 View 层次结构中的 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 相关。祝你好运!

关于ios - CGRectIntersectsRect 工作不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39298287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com