ios - 键盘和 UI 元素高度的自动布局问题

标签 ios swift xcode autolayout uikeyboard

Swift 5、Xcode 10

我的UIViewController的布局:

enter image description here

我使用this打开键盘时将服务器文本字段向上推的代码。

一开始它把底部的UIStackView推到了顶部,所以我添加了Server Stack View.top >= Username Stack View.bottom + 20约束,现在保持适当的距离。

但现在,当服务器文本字段向上推时,它也会自动降低其高度。将服务器堆栈 View 的固定高度设置为60.5会影响“登录”按钮,因此我将用户名堆栈 View 的高度设置为固定的110.5,这并没有影响改变任何东西。

我尝试将多个 UI 元素的垂直内容压缩阻力优先级更改为 999,但始终有一个 UI 元素的高度降低。

正如您在此屏幕截图中看到的,键盘上方有足够的空间:

enter image description here

如何使自动布局使用此空间而不是“挤压”UI 元素?

编辑:

我发现这个额外的空间是什么:它是“版本”标签的高度及其约束(在我的例子中距离屏幕底部 30 点)。不幸的是,我还无法摆脱这个 - 除了删除标签之外,这仍然无法阻止“smushing”。

最佳答案

键盘上方的额外空白空间等于“版本”标签的高度及其约束(在我的情况下距离屏幕底部 30 磅)。

“挤压”是由 UIStackViewcenterY - 120 约束引起的,甚至更改“内容压缩阻力优先级”也不起作用。另外,如果周围有 UIScrollView,它会提示“y 位置”缺少约束(即使其他约束设置正确)。

不幸的是,到目前为止,我发现的唯一适用于这两个问题的修复方法是消除原因并更改布局。 :/

我最终得到了什么:

enter image description here

一些值得注意的事情:

  • 添加了 subview ,以便始终将“版本”标签保留在屏幕底部 - 即使键盘处于事件状态也是如此。
  • 登录 View 使用KeyboardLayoutConstraint类作为其“底部”约束。如果没有它,滚动将被完全禁用。
  • 堆栈 View 的大小通过内部的标签和文本字段设置。
  • 必须添加两个额外的 UIStackViewUIView(1x 用户名,1x 服务器)以保持 UITextFields 的宽度为 200 > 但周围的 UIStackViewUIScrollView 仍然使用 0pts 的前导/尾随约束。如果没有,水平定位所有内容都不会粘住,Xcode 会提示,UIScrollView 非常窄,这也意味着不可能在侧面滚动。
  • 即使键盘弹起且 UIScrollView 可滚动,“top + 100”约束(Stack View)仍然可见。我知道它不漂亮,但这是我发现的唯一不会将文本字段粘贴到 View 顶部的解决方案,因为“middle - 100”不起作用。可能可以通过更改 KeyboardLayoutConstraint 类来摆脱它。

关于ios - 键盘和 UI 元素高度的自动布局问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56833750/

相关文章:

ios - 尝试保存核心数据对象时出错

ios - 快速找出单击按钮的父 View

swift - 如何在 Swift 中将颜色类型分配给类变量?

ios - "Calendar.current.isDate"日期参数是否需要使用同一时区的日期?

Xcode 卡在索引上

ios - 在 IOS 8 中使用共享扩展时如何获取源应用程序的包 ID

ios - 在前台推送通知

ios - 在 UITextField 上向左滑动手势

删除条目后 UITableView 卡住

xcode - iPhone 模拟器屏幕截图未捕获设备边框