Ios 间距相等的水平正方形

Ios 间距相等的水平正方形,ios,swift,Ios,Swift,我试着做一行5个相等的正方形(每个50x50),它们之间的间距为20dp。我不想让任何东西拉伸,但同时我想让它这样,如果我隐藏其中一个方块,其他方块就会移动过来 例如: +-----+ +-----+ +-----+ +-----+ +-----+ | 50 | 20 | 50 | 20 | 50 | 20 | 50 | 20 | 50 | | x50 | | x50 | | x50 | | x50 | | x50 | +-----+

我试着做一行5个相等的正方形(每个50x50),它们之间的间距为20dp。我不想让任何东西拉伸,但同时我想让它这样,如果我隐藏其中一个方块,其他方块就会移动过来

例如:

+-----+    +-----+    +-----+    +-----+    +-----+
| 50  | 20 | 50  | 20 | 50  | 20 | 50  | 20 | 50  |
| x50 |    | x50 |    | x50 |    | x50 |    | x50 |
+-----+    +-----+    +-----+    +-----+    +-----+
然后,如果我将中间的方块设置为
ishiden=true
,我希望其他方块移到上面:

+-----+    +-----+    +-----+    +-----+
| 50  | 20 | 50  | 20 | 50  | 20 | 50  |
| x50 |    | x50 |    | x50 |    | x50 |
+-----+    +-----+    +-----+    +-----+

这可能吗?我的第一个想法是堆栈视图,但我认为这不可行,因为它们是用来调整间距的。

您应该使用堆栈视图。但要隐藏某个正方形,需要将其alpha设置为0,而不是将其隐藏。在这种情况下,布局将保持不变-您可以隐藏一些方块,其他方块将保持其位置。如果需要其他正方形以元素之间的给定间距填充空白,请使用isHidden属性

  • 例如,有5个圆:0-0-0-0-0

  • 让我们设置3个圆:0-0-0-0

  • 现在把3圈的阿尔法设为0:0-0--0-0


有很多方法可以做到这一点,而另一个答案中提到的
StackView
是一个很好的选择,如果您可以使用它的话。如果没有,您还可以:

  • 对每个项目的50px项目设置宽度限制(您可能已经这样做了)。要隐藏项目时,还应将其宽度约束设置为
    0.0
    。显示项目时,将其设置回
    50.0

    yourWidthConstraint.constant = visible ? 50.0 : 0.0
    
  • 始终隐藏最后一项,并简单地移动其他项的内容。例如,如果每个项目都是
    UIImageView

    for i in hiddenIndex...lastVisibleIndex-1 {
        element[i].image = element[i + 1].image
    }
    element[lastVisibleIndex].isHidden = true
    

  • 使用
    UIStackView

    • 宽度尾部约束
    • 分配:填充
    • 间距:20
    • 的每个子视图宽度和高度约束设为常数:50
    你最终会得到:

       1          2          3          4          5
    +-----+    +-----+    +-----+    +-----+    +-----+
    | 50  | 20 | 50  | 20 | 50  | 20 | 50  | 20 | 50  |
    | x50 |    | x50 |    | x50 |    | x50 |    | x50 |
    +-----+    +-----+    +-----+    +-----+    +-----+
    
    删除视图#3,方法是:

    你现在有:

       1          2          4          5
    +-----+    +-----+    +-----+    +-----+
    | 50  | 20 | 50  | 20 | 50  | 20 | 50  |
    | x50 |    | x50 |    | x50 |    | x50 |
    +-----+    +-----+    +-----+    +-----+
    
    您将通过以下操作获得相同的结果:

    let v = stackView.arrangedSubviews[2]
    v.isHidden = true
    

    堆栈视图将隐藏视图#3,从而删除其占用的空间。如果将
    .ishiden
    设置回
    false
    ,视图将重新显示在其原始位置,将视图4和5移回其原始位置。

    将堆栈视图水平居中于其父视图中,并且不添加前导或尾随约束。我想OP希望布局移过,所以我认为isHidden是很好的不,OP特别希望其他方块移过去,填满现在的空白。他们应该使用
    hidden=true
    ,而不是
    alpha=0
    。有3个圆圈:0-0-0。如果将第二个隐藏,结果将是:0-0。如果你把秒的alpha设为0,结果是:0--0。这是UISTK的关键功能(视图)
    let v = stackView.arrangedSubviews[2]
    v.isHidden = true