gpt4 book ai didi

ios - View 在水平和垂直方向上模棱两可,布局复杂

转载 作者:可可西里 更新时间:2023-11-01 05:04:34 25 4
gpt4 key购买 nike

我的 Storyboard 上有一个UIViewController,它具有水平并排的2个 subview 。我添加了约束以将前缘和后缘固定为常数(20磅),并添加了另一个约束以使宽度保持相等。如果我假设以下内容,则应该可以计算每个 subview 的宽度为:

  • subview 不与
  • 重叠
  • 没有其他 View (至少水平)
  • 屏幕的宽度( super View )是已知的

  • 但是,XCode给我警告,我的 View 在水平方向上是模棱两可的。我猜这意味着XCode不会做出这些假设之一,但是它是哪一个?有没有办法让我指示XCode做出这个假设?

    编辑:好吧,玩了一下,并得到了警告,该警告消失了,但是看起来它并没有做出第一个假设-只是将每个 subview 的宽度设置为 superview.width - 40,并愉快地将一个 View 埋在另一个 View 下。所以问题是如何阻止它们重叠?

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

    因此,在此设置中,我有4个垂直和水平交错的 View 。我希望蓝色,红色和紫色 View 都具有相同的 subview.frame.size.width = superview.width - 60。蓝色和紫色在左列中对齐,红色在右列中单独排列,并且所有间隙(两列之间以及每列之间及其最接近的边缘)的间距都恒定(20个百分点)。这3个表的高度可变,我将按照 James's answer here中的说明通过编程方式进行设置。底部是一个粉红色的 View ,该 View 延伸了屏幕的宽度(减去间隙),并且位于紫色或红色 View 下方的20 pt不变位置(以较低者为准)(我正在尝试通过给它一个每个 View 的间距约束> = 20,并且我希望它能为其中一个选择正好20)。由于所有高度都是动态的,不一定同时显示在屏幕上,因此我将其 super View 设置为 UIScrollView而不是常规的 UIView

    说完所有内容后,我仍然收到警告,所有4个 View 在水平方向上都是歧义的,粉红色的条在垂直方向上是歧义的。我认为很难理解应该紧随其后的内容,这就是为什么它认为它在水平方向上是模棱两可的。而且我认为将粉红色的条形图放置在紫色或红色 View 的下方正好20点位置是不明智的,这就是为什么它认为它在垂直方向上是模棱两可的。任何人都可以确认或否认这些怀疑吗?或提出解决方法?当我最后运行它时,我就得到了(我将滚动 View 的背景设为黄色,您无法在 Storyboard 中截屏):

    最佳答案

    垂直模棱两可

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

    例如,如果紫色 View 的底部最终低于红色 View 的底部(如我的第一个屏幕截图所示),则Xcode应该尝试将粉色和红色 View 之间的垂直距离设置为20,但是将会认识到,这与紫色和粉红色之间的间距> = 20的条件冲突。现在,当Xcode查看紫色和粉红色 View 之间的间距为20的约束时,它将检查该约束,使粉红色和红色之间的距离必须至少为20。因为红色 View 的底部大于在紫色 View 的底部,红色和粉红色之间的> = 20约束仍然会通过。

    因此,对于TL; DR,您可以设置一个 View ,使其与多个 View 中的最远 View 之间的距离为给定值(x),方法是为该 View 提供> = x约束(优先级为1000),为它提供= = x约束优先级为<1000您正在考虑的每个 View 的优先级-并且我的纵向歧义性问题已解决。对于这四种 View 的水平歧义,我还没有解决方案。

    水平模棱两可

    好的,我现在也修复了水平歧义部分。归结为,滚动 View (因此表 View )中的约束的工作方式不同于其他任何类型的 View 中的约束。这是逐步的样子。

  • 放置UIScrollView
  • UIView放入UIScrollView中,以用作该滚动 View
  • 的“ contentView
  • 添加约束以将contentView固定到滚动 View 的所有4个角,并固定widthheight(因此contentView和它的superview之间有6个约束-比平时多2个约束)。请注意,可以将widthheight固定到比正常屏幕尺寸大得多的位置,这可能就是为什么要使用滚动 View 开始的原因。
  • UIScrollView中添加您想要的所有其他 View (UIButtonsUILabels等)-我只是从这里开始假设UILabel,所以我不必键入太多,但是任何一种UIView子类都可以使用)作为contentView的 subview ,而不是直接作为UIScrollView的 subview

  • 通过此设置,被赋予其 super View 约束的 UILabel将会约束到 contentView,后者具有已定义的大小,因此没有任何歧义。

    另外,如果您想修复 UILabel的大小(或根据应用程序的功能动态计算它们的大小),然后让 contentView扩展以容纳它们:
  • 放置UIScrollView
  • UIView放入UIScrollView中,以用作该滚动 View
  • 的“ contentView
  • 添加约束以将contentView固定到滚动 View 的所有4个角,并固定widthheight
  • width上的contentView约束创建一个导出(假设我们将其命名为contentViewWidthConstraint)
  • 放置UILabel
  • 修复UILabel的大小
  • width上的
  • 上的 UILabel约束创建导出

    然后在 viewWillLayoutSubviews的代码中
  • 相加所有UILabel的宽度以及它们之间想要的任何间隙(作为CGFloat,我将其称为totalWidth)
  • 设置contentViewWidthConstraint.constant = totalWidth

  • 而且你很好走!请注意,在本示例的大部分内容中,我假设您是在设置宽度,但是它应该同样适用于高度。

    关于ios - View 在水平和垂直方向上模棱两可,布局复杂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19253937/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com