3

有没有办法在 UIViews 的 NSArray 中找到边缘。

例如,下图显示了一组 UIView(1 到 7)。每个视图都与另一个视图相邻。所以视图 1 可能是 (0,0,70,20),视图 6 是 (70,0,30,50)。

我将如何返回作为视图之间分隔符的行数组。在下面的示例中,将有 6 个分隔符(内部行)。

    ---------------------
    |     1      |   6  |
    |            |      |
    -------------|      |
    |  2   |  3  |      |
    |      |-----|      |
    |      |  4  |------|
    -------------|      |
    |     5      |  7   |
    ---------------------

我的第一次尝试获取每个正方形的内部线(不在容器视图外部的线),删除重复项(即 3 到 4 之间的那些),

..然后删除与边缘上的其他线接触的线,直到剩下一条。不幸的是,这删除了最右边的垂直线。

我最后一部分的代码:

NSMutableArray *sidesToDiscard = [[NSMutableArray alloc] init];
for (NSValue *rect1 in self.sides)
{
    for (NSValue *rect2 in self.sides)
    {
        if ([rect1 isEqualToValue:rect2])
        {

        } else
        {
            BOOL xIsSame = (rect2.CGRectValue.origin.x == rect1.CGRectValue.origin.x);
            BOOL bothAreVertical = (rect2.CGRectValue.size.width == 0 && rect1.CGRectValue.size.width == 0);
            BOOL areTouchingOnVertical = ((rect1.CGRectValue.origin.y + rect1.CGRectValue.size.height == rect2.CGRectValue.origin.y) || (rect1.CGRectValue.origin.y == rect1.CGRectValue.origin.y + rect2.CGRectValue.size.height));

            BOOL yIsSame = (rect2.CGRectValue.origin.y == rect1.CGRectValue.origin.y);
            BOOL bothAreHorizontal = (rect2.CGRectValue.size.height == 0 && rect1.CGRectValue.size.height == 0);
            BOOL areTouchingOnHorizontal = ((rect1.CGRectValue.origin.x + rect1.CGRectValue.size.width == rect2.CGRectValue.origin.x) || (rect1.CGRectValue.origin.x == rect2.CGRectValue.origin.x + rect2.CGRectValue.size.width));

            if (((xIsSame && bothAreVertical) && areTouchingOnVertical) || ((yIsSame && bothAreHorizontal) && areTouchingOnHorizontal))
            {
                // if are touching then remove, leaving one left...
            [sidesToDiscard addObject:rect1];
                [sidesToDiscard addObject:rect2];
            }
        }
    }
}
[self.sides removeObjectsInArray:sidesToDiscard];
4

1 回答 1

1

您可以将每个视图(矩形)转换为 4 个端点。删除重复的点。由于每条线段是通过连接两个点形成的,因此您可以通过遍历所有可能的点对来遍历所有可能的线段,并且您希望找到符合以下条件的线段

  1. 线段上的每个点都与某些视图相邻
  2. 越长越好
  3. 垂直或水平
  4. 不在容器视图的外部

要检查 1,您必须遍历视图的所有边缘,删除线段和边缘的交点。如果什么都没有,你知道它可能是你想要的线段。

3和4很容易检查。

遍历满足 1、3、4 的所有线段。如果有两条线段相交,则删除较短的一条。剩下的必须满足2。

于 2013-08-22T21:14:01.287 回答