Ios 在UIView数组中查找边

Ios 在UIView数组中查找边,ios,objective-c,uiview,cgrect,Ios,Objective C,Uiview,Cgrect,有没有一种方法可以在一排UIView中找到边 例如,下图显示了UIView(1到7)的集合。每个视图邻接另一个视图。因此视图1可以是(0,0,70,20),视图6可以是(70,0,30,50) 如何返回视图之间分隔符的行数组。在下面的示例中,将有6个分离器(内部管线) 我的第一次尝试获取每个正方形的内部线条(不在容器视图外部的线条),删除重复的线条(即3到4之间的线条) ..然后删除边缘上与其他线接触的线,直到剩下一条。不幸的是,这会删除最右边的垂直线 最后一部分的代码: NSMutableAr

有没有一种方法可以在一排UIView中找到边

例如,下图显示了UIView(1到7)的集合。每个视图邻接另一个视图。因此视图1可以是(0,0,70,20),视图6可以是(70,0,30,50)

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

我的第一次尝试获取每个正方形的内部线条(不在容器视图外部的线条),删除重复的线条(即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,必须遍历视图的所有边,删除线段和边的交点。如果什么都没有留下,您知道它可能是您想要的线段

    3和4很容易检查


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

    您是否尝试过编写算法来解决您的问题?我已将现有代码添加到问题中。我相信有一个更优雅的解决方案,它实际上是有效的。也许我只是太厚了,但为什么要删除边缘上与其他线条接触的线条?你想避免什么问题?问另一个问题:为什么把你想要的描述为“所有的内部边缘,没有重复”是不准确的?
    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];