gpt4 book ai didi

ios - 多个 UIView 的重叠

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:14:45 25 4
gpt4 key购买 nike

我正在自定义 UIView 中创建多个自定义 UIView。自定义 subview 的创建是可以的。它们看起来像这样:

enter image description here

绘制方法非常简单:

[[UIColor brownColor] set];

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(ctx,
5.0f);
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, 0.0f, 0.0f);
CGContextAddLineToPoint(ctx, 100.0f, 0.0);
CGContextAddLineToPoint(ctx, 130.0f, 25.0f);
CGContextAddLineToPoint(ctx, 100.0f, 50.0f);
CGContextAddLineToPoint(ctx, 0.0f, 50.0f);
CGContextClosePath(ctx);
CGContextStrokePath(ctx);
[super drawRect:rect];

将它添加到 super View 中也很简单:

    ITContextFigure *view = [[ITContextFigure alloc] initWithFrame:CGRectMake(location.x, location.y, 135.0f, 50.0f)];
[view setBackgroundColor:[UIColor yellowColor]];
[self addSubview:view];

所以我的问题是:

1) 如何检测一个与另一个重叠?

我看到了这个解决方案:

if (CGRectContainsRect([myImageView1 frame], [myImageView2 frame])) {
NSLog(@"Overlaped, it's working!");
}

但如果我有多个 UIViews,在 super view 上执行 for 并检查每个 subview 似乎不是对我来说很好的解决方案。

2)遇到这种情况,怎么办?

enter image description here

我的主要目标是检测这种情况何时发生:

enter image description here


更新 1.0

将尝试显示的内容 here ,因为没有更优雅的方式。如果我能够实现它,我会把代码发布到 Github 上,如果有人需要的话。

最佳答案

通过巧妙地对数据进行排序(这些称为扫描线或渗线算法),您可以大大减少需要进行的碰撞检测的数量。下面概述了如何将此技术应用于您的情况。

将您的 subview 排序到按 y 升序排列的数组中。如果两个 subview 共享相同的 y,则按 x 升序排列它们。这是您的非事件列表,它构成了算法的主要输入。

算法进行如下。

  1. 当有非事件 subview 时,选择一个active_y。这是非事件列表中第一个 subview 的 y 坐标。

  2. 将所有起源于 active_y 行的 subview 移动到工作列表中,按 x 升序排序。这是事件列表。

  3. 运行事件列表冲突测试每个 subview 与列表中的后续 subview 。您可以使用列表中的两个索引(我们称它们为 leftright)来执行此操作。一旦您看到无法与 left 相交的 right subview ,您就可以推进 left 索引。

  4. 在进行碰撞检测时,您还检查 subview 现在是否完全位于 active_y 下方。一旦是,您应该将其从事件列表中删除。

当非事件列表中的所有 subview 都被消耗完并且完成对事件列表的最终运行时,算法完成。

该算法极大地减少了您需要执行的碰撞​​检测次数并且大致为 O(n log n),但它也可以简化碰撞检测本身。

由于事件列表是从左到右排序的,所以当您执行检测例程时,您总是知道哪个在左边,哪个在右边。因此,例如,在比较示例中的箭头形状时,您只需要检查右侧形状的两个最左边的顶点是否落在左侧形状内。您可能会发现 CGPathContainsPoint 很有用。

如果您要处理的不同形状的数量增加,那么您可能需要考虑将碰撞检测插入扫描线算法本身。这有点棘手,但基本上不是包含 subview 指针的列表,而是包含构成形状(不包括水平形状)的线段。

关于ios - 多个 UIView 的重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11473189/

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