1

我正在创建一个自定义模态视图,其中包含一堆 UILabel、UIImages 等,并将显示为模态视图。视图必须使用自动布局,并且必须以编程方式完成,而不是使用故事板/xibs(不幸的是)。

模态视图随着内容的增长而增长,直到它从屏幕的边缘(顶部、底部、左侧、右侧)到达 8 个点。

子视图之间的很多边距是 16 和 24 点。在较新的 iPhone 和纵向模式下,这一切都很棒,并且在屏幕和模态视图之间留下了足够的空间。但是当旋转到横向时,模态视图从顶部/底部边缘达到 8 pt 限制,并且许多子视图完全缩小。

解决此问题的方法是将子视图之间的所有“边距”更改为 8 点。这让一切都有足够的空间展示。

我的目标是能够动态调整边距,以便它们将“尝试”较高的值(即 16、24),但如果视图已经填满屏幕,则会“回退”到较小的值(即 8)。

我知道一种方法是使用多个约束,并在方向改变时切换它们,但如果可能的话,我不想走那条路,因为随着时间的推移,在进行更改时管理可能会很痛苦。

我确实发现了一个花絮,说你可以使用优先级值做这样的事情:

NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-(24@200,8@900)-[titleLabel]-[detailsLabel]-(24@200,8@900)-[button(40)]-(24@200,8@900)-|", options: [.AlignAllCenterX], metrics: metrics, views: views))

但是,即使视图有足够的空间增加高度,这也总是会回落到 '8@900' 值。

我也试过这个,这似乎适用于一些子视图,但不是全部:

NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-(>=8,<=24)-[titleLabel]-[detailsLabel]-(>=8,<=24)-[button(40)]-(>=8,<=24)-|", options: [.AlignAllCenterX], metrics: metrics, views: views))
4

2 回答 2

3

它不会回退到 8,8 是比 24 更高的优先级约束,所以如果可能的话它会这样做。在 Auto Layout 中,1000 被认为是必需的(即,如果有两个互斥的 1000 优先级约束,您会在日志中看到一堆错误)。相反,优先级 0 - 999 都被认为是可选的。任何可选的东西都可以被系统破坏以满足所需的约束,并且您基本上选择一个介于 0 和 999 之间的值来指定您希望它们被破坏的顺序(0 是首先破坏的顺序,999 是最后破坏的顺序) . 还值得注意的是,各种系统事件发生在不同的优先级上。

我会考虑通过将较小的边距设为所需优先级(1000)的不等式并将较大的边距设为优先级 999 的等式来解决您的问题。这样,它将尝试使用 24 点值,但如果在保持其他所需的约束,它将使其小至 8 个点。

值得注意的是,这两个差距可能不会以相同的速度缩小。要做到这一点,您可能需要做一些棘手的事情,例如使用直接固定到超级视图的隐藏视图(隐藏视图仍然会影响布局)和所需高度 >=8 以及高度为 24@999 的标签. 然后你可以使这两个隐藏视图也被限制为彼此相等。如果您能够支持 iOS 9.x+,则可以UILayoutGuide改用。

NSLayoutConstraint.constraintsWithVisualFormat("V:|-(>=8,24@999)-[titleLabel]-[detailsLabel]-(>=8,24@999)-[button(40)]-(>=8, 24@999)-|", options: [.AlignAllCenterX], metrics: metrics, views: views)
于 2016-06-08T22:33:51.297 回答
0

我想当尺寸等级发生变化时我会调整约束。而不是有多个约束,只需在大小类发生变化时将常量从 16 调整为 8。

if (self.view.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact)
    // set constraints which implement margins to constant of 8
else
    // set constraints which implement margins to constant of 16

更多信息在这里

于 2016-06-08T22:41:26.400 回答