【问题标题】:Breaking constraints when changing stackview axis更改 stackview 轴时打破约束
【发布时间】:2018-03-10 21:19:54
【问题描述】:

我目前正在尝试根据设备的方向更改堆栈视图上的轴。手机垂直时一切正常,但一旦我水平移动,我的限制就会打破。

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

  1. 对齐 - 填充
  2. 分布 - 填充
  3. 轴 - 垂直

我发现将方向更改为水平时打破了我的限制,它是蓝色视图上设置的恒定高度。为了解决这个问题,我创建了一个蓝色视图高度约束的 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
    }
}

这不起作用。我的约束仍然打破。然后我为蓝色视图创建了一个宽度约束(认为堆栈视图需要水平时的宽度)。我正在根据方向激活/停用蓝色视图的高度/宽度约束。唉,这也导致了约束被打破(换句话说,我的观点到处都是)。

我下面的图片是我想要实现的。我应该设置或不设置什么来获得所需的外观。

【问题讨论】:

  • 我最终放弃了为此使用堆栈视图。我只是无法让它工作。相反,我创建了一个垂直约束和水平约束的列表。根据屏幕的方向,我激活/停用相应数组中包含的约束。

标签: ios swift swift4 uistackview


【解决方案1】:

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

在这之后只是玩大小类的问题。在 StackView1 上,我会在手机横屏时将 stackView 的轴设置为水平:

和视图之间的约束,还要记住大小类:

蓝色和橙色视图之间:

最后在蓝色和黑色视图之间:

注意:在两个堆栈视图中,我都使用对齐:填充和分布:填充

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多