Swift 5、Xcode 10
我的UIViewController
的布局:
我使用this打开键盘时将服务器文本字段
向上推的代码。
一开始它把底部的UIStackView
推到了顶部,所以我添加了Server Stack View.top >= Username Stack View.bottom + 20
约束,现在保持适当的距离。
但现在,当服务器文本字段
向上推时,它也会自动降低其高度。将服务器堆栈 View
的固定高度设置为60.5会影响“登录”按钮,因此我将用户名堆栈 View
的高度设置为固定的110.5,这并没有影响改变任何东西。
我尝试将多个 UI 元素的垂直内容压缩阻力优先级
更改为 999,但始终有一个 UI 元素的高度降低。
正如您在此屏幕截图中看到的,键盘上方有足够的空间:
如何使自动布局使用此空间而不是“挤压”UI 元素?
编辑:
我发现这个额外的空间是什么:它是“版本”标签的高度及其约束(在我的例子中距离屏幕底部 30 点)。不幸的是,我还无法摆脱这个 - 除了删除标签之外,这仍然无法阻止“smushing”。
最佳答案
键盘上方的额外空白空间等于“版本”标签的高度及其约束(在我的情况下距离屏幕底部 30 磅)。
“挤压”是由 UIStackView
的 centerY - 120
约束引起的,甚至更改“内容压缩阻力优先级”也不起作用。另外,如果周围有 UIScrollView
,它会提示“y 位置”缺少约束(即使其他约束设置正确)。
不幸的是,到目前为止,我发现的唯一适用于这两个问题的修复方法是消除原因并更改布局。 :/
我最终得到了什么:
一些值得注意的事情:
- 添加了
subview
,以便始终将“版本”标签保留在屏幕底部 - 即使键盘处于事件状态也是如此。 登录 View
使用KeyboardLayoutConstraint
类作为其“底部”约束。如果没有它,滚动将被完全禁用。堆栈 View
的大小通过内部的标签和文本字段设置。- 必须添加两个额外的
UIStackView
和UIView
(1x 用户名,1x 服务器)以保持UITextFields
的宽度为 200 > 但周围的UIStackView
和UIScrollView
仍然使用 0pts 的前导/尾随约束。如果没有,水平定位所有内容都不会粘住,Xcode 会提示,UIScrollView
非常窄,这也意味着不可能在侧面滚动。 - 即使键盘弹起且
UIScrollView
可滚动,“top + 100”约束(Stack View
)仍然可见。我知道它不漂亮,但这是我发现的唯一不会将文本字段粘贴到 View 顶部的解决方案,因为“middle - 100”不起作用。可能可以通过更改KeyboardLayoutConstraint
类来摆脱它。
关于ios - 键盘和 UI 元素高度的自动布局问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56833750/