视图水平和垂直不明确且布局复杂

2024-06-26

我有一个UIViewController在我的故事板上有 2 个水平并排的子视图。我添加了约束来将前缘和后缘固定为常数(20 点),并添加了另一个约束来保持宽度相等。如果我假设以下内容,应该可以计算每个子视图需要的宽度:

  • 子视图不重叠
  • 不存在其他视图(至少在水平方向上)
  • 屏幕(超级视图)的宽度已知

然而,XCode 警告我,我的观点在水平上是不明确的。我猜这意味着 XCode 没有做出这些假设之一,但它是哪一个呢?有没有办法让我指示 XCode 做出这样的假设?

编辑:好的,玩了一下,警告消失了,但看起来它并没有做出第一个假设 - 它只是将每个子视图的宽度设置为superview.width - 40,并高兴地将一种观点埋在另一种观点之下。所以问题是如何阻止它们重叠?

编辑 2:好的,我的实际屏幕比我的简单示例复杂得多。这是我得到的:

因此,在此设置中,我有 4 个垂直和水平交错的视图。我希望蓝色、红色和紫色视图都相同subview.frame.size.width = superview.width - 60。蓝色和紫色在左列中排列,红色单独在右列中,并且所有间隙(两列之间以及每列与其最近的边缘之间)都是恒定的(20 点)。这 3 个桌子具有可变高度,我将按照中所述以编程方式进行设置詹姆斯的回答在这里 https://stackoverflow.com/questions/19252020/xcode-5-auto-layout-embedded-tables。底部是一个粉红色视图,它拉伸了屏幕的宽度(减去间隙),并且位于紫色或红色视图下方恒定 20 点(以较低者为准)(我试图通过给它一个每个视图的间距约束 >= 20,我希望它能为其中一个视图选择正好 20)。由于所有高度都是动态的,并且可能不一定同时适合屏幕,因此我将它们的超级视图设为UIScrollView而不是正常的UIView.

当一切都说了又做了之后,我仍然收到警告,我的所有 4 个视图在水平方向上都不明确,并且粉红色条在垂直方向上不明确。我认为它很难意识到什么应该放在什么旁边,这就是为什么它认为它在水平上是不明确的。我认为它不会选择将粉红色条放置在紫色或红色视图下方 20 点处,这就是为什么它认为它在垂直方向上不明确。谁能证实或否认这些怀疑?或者建议一种解决方法?当我最后运行它时,我得到了这个(我将滚动视图的背景设置为黄色,你在故事板屏幕截图中看不到):


纵向模糊

好吧,我想我已经解决了垂直模糊部分。我在粉色和紫色视图之间添加了两个垂直约束,在粉色和红色视图之间添加了两个垂直约束。对于每一对,第一个约束是它们之间的间距必须 > 20 pts,并且具有 1000 优先级。第二个约束是间距 = 20 点,但它只有 800 优先级。

例如,如果紫色视图的底部最终低于红色视图的底部(正如我的第一个屏幕截图中所示),Xcode 应该尝试将粉色和红色视图之间的垂直距离设置为 = 20,但它会意识到这与紫色和粉色之间的间距 >= 20 的条件相冲突。由于 >= 约束具有更高的优先级,因此 = 约束将被忽略。现在,当 Xcode 查看紫色和粉色视图之间的间距 = 20 的约束时,它会检查粉色和红色视图之间的间距必须至少为 20 的约束。由于红色视图的底部高于在紫色视图的底部,红色和粉色之间的 >= 20 约束仍然通过。

因此,TL;DR,您可以设置一个视图,使其与多个视图中最极端的值具有给定值 (x) 的间距,方法是为其赋予优先级为 1000 的 >= x 约束,并为其赋予

横向模糊

好吧,我现在也修复了水平模糊的部分。归根结底,滚动视图(以及表视图)中的约束的工作方式与任何其他类型的视图不同。这是分步的样子。

  • 放置UIScrollView
  • Place a UIView进入UIScrollView充当“contentView“ 对于该滚动视图
  • 添加约束以固定contentView到滚动视图的所有 4 个角并固定它width and height(所以之间有 6 个约束contentView它是超级视图 - 比平常多 2 个)。请注意,widthheight可以固定到比正常屏幕尺寸大得多的东西,这可能就是您首先使用滚动视图的原因。
  • 添加您想要的所有其他视图UIScrollView (UIButtons, UILabels等等-我只是假设UILabel从这里开始,我不必输入太多内容,但是任何类型的UIView子类将工作)作为子视图contentView,不直接作为子视图UIScrollView

通过此设置,UILabel对其超级视图给予约束的 s 将约束contentView,它有一个定义的大小,所以没有什么是模糊的。

或者,如果您想固定尺寸UILabels(或动态计算它们,具体取决于您的应用程序的功能)并让contentView展开以容纳它们:

  • 放置UIScrollView
  • Place a UIView进入UIScrollView充当“contentView“ 对于该滚动视图
  • 添加约束以固定contentView到滚动视图的所有 4 个角并固定它width and height
  • width的限制contentView(假设我们将其命名为contentViewWidthConstraint)
  • 放置UILabels
  • 修复尺寸UILabels
  • width的限制UILabels

然后在代码中viewWillLayoutSubviews

  • 将所有的宽度相加UILabels 以及它们之间您想要的任何间隙(作为CGFloat,我称之为totalWidth)
  • set contentViewWidthConstraint.constant = totalWidth

你就可以出发了!请注意,我假设您在本示例的大部分内容中设置宽度,但它应该同样适用于高度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视图水平和垂直不明确且布局复杂 的相关文章

随机推荐