更改stackview轴

时间:2018-03-10 21:19:54

标签: ios swift swift4 uistackview

我目前正在尝试根据设备的方向更改堆栈视图中的轴。电话是垂直的,一切都很好,但一旦我走水平,我的约束就会破裂。

目前,我在垂直堆栈视图中有蓝色视图和橙色视图。我将堆栈视图固定到超级视图的前沿,顶部和后缘。我将堆栈视图的底部固定到黑色视图。因为堆栈视图中的子视图不成比例,所以我将蓝色视图设置为70的恒定高度。 堆栈视图设置如下:

  1. 对齐 - 填充
  2. 分发 - 填写
  3. 轴 - 垂直
  4. 我发现在将方向更改为水平时会破坏我的约束,这是在蓝色视图上设置的恒定高度。为了解决这个问题,我创建了一个蓝色视图高度约束的IBOutlet。当手机旋转时,我正在停用约束:

     override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        if UIDevice.current.orientation.isLandscape {
            blueViewHeight.isActive = false
            stackView.axis = .horizontal
        } else {
            blueViewHeight.isActive = true
            stackView.axis = .vertical
        }
    }
    

    这不起作用。我的约束仍然存在。然后我为蓝色视图创建了一个宽度约束(认为堆栈视图需要宽度而水平)。我正在根据方向激活/停用蓝色视图的高度/宽度约束。唉,这也导致了破坏的限制(换句话说,我的观点遍布整个地方)。

    我下面的图像是我想要实现的。我应该设置或不设置,以获得所需的外观。

    Vertical View

    Horizontal View

1 个答案:

答案 0 :(得分:1)

要实现这一点,你应该使用2个堆栈视图,一个包含蓝色和橙色视图我称之为StackView1,第二个包含StackView1和黑色视图我将调用此StackView2。

view hierarchy

此后只需玩大小班。在StackView1上,当手机处于风景时,我会将stackView的轴设置为水平:

Axis

和视图之间的约束,同时记住大小类:

蓝色和橙色视图之间:

bo1 bo2

最后在蓝色和黑色的观点之间:

bb2 bb1

注意:在两个stackViews中我都使用了alignment:fill和distribution:fill