【问题标题】:Xcode storyboard constraints and auto layoutXcode 故事板约束和自动布局
【发布时间】:2018-04-15 10:41:11
【问题描述】:

我目前正在开发一个应用程序,过去两周我一直在努力解决的一件事就是自动布局。我是 iOS 编程的新手,所以我不确定解释我的问题的最佳方法,但这里是。

我正在制作一个钢琴应用程序,它的工作方式是我的键盘只是一堆彼此相邻的按钮。

这些按钮代表按键。这些按钮具有普通钢琴键图像的背景图像。现在我的问题是我的键上方有一个黑色,每当我尝试使用 pin 工具为我的钢琴键创建约束时,只要我添加约束,所有东西都会被向上推,我的键会垂直拉伸。

上周我一直在不停地工作,不知道出了什么问题。我遵循了许多教程,但我遵循的教程非常基础,最多有几个标签或按钮,由大量空间隔开。我不确定是不是因为我的按钮间隔不够,还是什么,但它只是非常沮丧。任何帮助或指南/教程都会非常有帮助...

我还尝试选中显示宽度和高度的框以保持宽度和高度,但这只会使某些设备上的按键太大或太小。有没有办法拉伸这些键以便它们适应他们的设备?我听说过固有大小的内容,但不知道如何应用超过 24 个按钮...

编辑: 我尝试了堆栈视图,但我所有的白键都被隔开并从情节提要中消失了:

【问题讨论】:

  • 对于白色按钮 -> StackView -> 将边缘全部固定为 0 -> 将 24 个按钮放入 StackView。
  • 您在顶部显示“方形”黑键,但在下方图像中显示“圆形”黑键...您能显示实际按钮图像吗?
  • 添加了一张新图片@DonMag
  • @J.Doe 我尝试用黑白键制作一个堆栈视图,但由于黑键而注意到间距。所以只有白键的堆栈视图我应该只覆盖黑键顶部并将它们固定在堆栈视图中?
  • 我的建议是:不要使用按键作为按键。使用视图。现在你可以说尺寸应该是多少。另外,你在这里的目标是什么?使用自动布局的目的是什么?换句话说,您希望在不同的屏幕尺寸上发生什么?

标签: ios xcode autolayout


【解决方案1】:

这就是我要做的。让我们暂时忽略顶部的黑条,只关注按键。暂时让我们忽略黑键。所以让我们假设我们有 14 个白键视图,无论屏幕大小,它们都将填满屏幕。

这很容易。从一个白键视图开始。将其固定在超级视图的顶部、左侧和底部,并将其宽度任意设置为 10。现在只需继续添加白键视图,将其左侧固定在前一个视图的右侧,将其顶部和底部固定到超级视图,并且它们的宽度设置等于第一个视图的宽度。最后,将第 14 个关键视图的右侧固定到父视图的右侧。

到那时,当然,Interface Builder 会退缩,因为宽度不会全部相加,无法将最左边的键固定在左边,最右边的键固定在右边。但是现在您删除了第一个键的宽度限制!很快,按键会自行调整以填满屏幕的总宽度。

这是我屏幕上 Interface Builder 中的结果。我留出了一点额外的空间,为了清楚起见,我把白键涂成绿色。我创建了一个 IBDesignable 自定义 UIView 子类,以模拟按键底端的圆形。

黑键是相似的,只是您需要三个不可见的“间隔”黑键来指示系列中的间隙。这是我添加了黑键的界面生成器:

这是在 iPad 模拟器上运行的应用程序:

这里是在 iPhone 5s 模拟器上运行的:

我认为,这表明这是一个可行的策略。从这一点开始,只需稍作调整即可获得您想要的外观。

【讨论】:

  • 好的,你所说的一切都非常有道理,我可以看到它特别适用于黑键的间距。我只是想知道使用不同视图的区别,我假设来自界面构建器的“视图”对象是正确的,有按钮吗?无论对象如何,约束都不相同吗?不过我会试试看的!
  • 按钮的问题是它们在自动布局下是自动调整大小的。我建议您使用自定义 UIView,以便完全控制大小和绘图。
  • 添加了黑键以及不同设备上的屏幕截图,以表明我们正在按照您的要求进行操作。
【解决方案2】:

在触发动作时,按钮将比视图更容易使用,因此请坚持使用按钮。我们将限制它们的大小以使其行为正常。

首先摆脱黑键,直到白键全部设置。

将所有白键固定在屏幕的顶部和底部。

将它们全部设置为具有相同的宽度。

将第一个键固定到父视图的前沿,将最后一个键固定到父视图的后沿。

选择所有的白键除了最后一个,并将右侧固定,间距为0。

这样应该可以让所有的白键填满屏幕,边缘周围或它们之间没有空间。

使用情节提要中的助理编辑器并从中选择预览。添加一些不同的屏幕尺寸并将它们变成横向。它可能看起来与设备上的不完全一样,但应该非常接近。

一旦白键看起来正确,就将黑键添加到组合中。

从一个黑键开始并拖动以将其调整到情节提要中的适当大小。一旦你有了正确的尺寸,就添加一个纵横比约束,这样你只需要担心调整宽度而不是高度。

暂时将黑键的标签设置为“b”或其他单字符,我们稍后会用到。

您需要做一些数学运算才能让黑键在所有屏幕上都具有正确的宽度……选择黑键并在尺寸检查器中查看它的宽度,对超级视图执行相同操作。一旦你有了这些数字,黑键宽度除以超级视图宽度。记下结果,稍后您将需要它。

现在您知道黑键占据屏幕宽度的百分比,选择黑键和超级视图。将它们设置为具有相同的宽度。 (这可能会使黑键变大,我们稍后会解决)

只选择黑键,进入尺寸检查器,双击使其宽度与父视图匹配的约束。

这将选择约束本身。在其属性中,将乘数设置为与黑键宽度除以屏幕宽度得到的十进制数相同。

这处理了黑键的大小,现在来处理它们的定位。

首先复制您创建的黑键,直到您拥有所需的所有内容。

选择所有黑键并将它们固定到超级视图的顶部。

手动将所有黑键拖到正确的位置(您不需要精确到正确的区域)。

我们需要做的最后一点对齐是使每个黑键的中心在白键之间的线上方……

选择一个黑键,然后控制或右键单击并从它拖动到其右侧的白键。从出现的菜单中选择水平间距。

在尺寸检查器中双击该新约束(它应该有一个负数)。

在约束的属性中,您应该看到它具有第一项和第二项。其中一项是“b”(或您之前用于黑键的任何标签)。如果您单击弹出菜单,您应该会看到尾随被选中。而是选择中心 X。最后将常量设置为0。

这应该将黑键锁定在适当的大小和位置。现在对其余的黑键重复这个过程。

完成后,您可以去掉标签并确保所有图像都已正确设置。

这不是一个快速的过程,但随着时间的推移会变得更容易。

如果白键最终在某些屏幕上出现空间,请尝试确保将它们设置为按比例填充(希望不会过多地弄乱底部曲线)。

【讨论】:

  • 我设法做白键,谢谢,但我如何设置黑键和superview的宽度相同?
  • Omg 好的,所以这非常有效,至少对于一个黑键。但是它不适用于 iPad 10.5 和 12.9……它适用于 iPad 9.7 和其他 iPhone 设备。有没有办法来解决这个问题?再次感谢修复工作非常好!
  • 如果这些大屏幕上的问题是黑键的大小,我会取消除一个黑键以外的所有黑键的纵横比和宽度约束,并添加约束以使它们都具有相同的宽度和相同高度。然后,您可以在当前无法使用的屏幕尺寸上调整 viewDidLoad 中的一种宽度和一种高度约束的常量。
  • 好的,所以我从黑键中删除了所有约束和纵横比,这很好,但每当我切换到更大的 iPad 时仍然会吓坏。我将尝试 viewDidLoad 约束,但我要为哪个按钮设置约束?对于他们所有人?我必须为每个黑键做一个 NSLayoutConstraint 吗?顺便说一句,非常感谢你到目前为止帮助我。对于刚开始使用 iOS 的人来说,这意味着很多!
  • 我忘了说得更具体一点。在 iPad 10.5 和 12.9 上,黑键被推到白键之上。我猜我必须在 viewdidload 中为 iPad 创建一个 NSLayoutConstraint 和一个 if 语句来识别应用程序是否在 iPad 上运行?我仍然不确定我的常量是什么,因为在最小的 iPad 上,黑键的位置是正确的,所以我的假设是每个 iPad 修改常量都必须不同..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2014-12-25
  • 2018-09-11
  • 2016-04-07
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多