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 中看不到的东西:

    aRandomXaRandomY 的计算。我想这看起来像这样:

    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 未检测到相交视图

在 CGRectIntersectsRect 中的调用错误中缺少参数 #2

通过 CGRect Intersects Rect 过滤 ns 可变数组

skspritenode 仅检查与子节点的交集

对包含在 2 个单独的父 UIView 中的子视图进行碰撞检测?

CGRect