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

时间:2019-07-01 10:07:10

标签: ios swift xcode autolayout uikeyboard

Swift 5,Xcode 10

我的UIViewController的布局:

enter image description here

打开键盘时,我使用this代码将Server Text Field向上推。

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

现在,当推上Server Text Field时,它也会自动减小高度。将Server Stack View的固定高度设置为60.5,使“登录”按钮变模糊,因此我将Username Stack View的高度设置为固定的110.5,这没有改变。

我尝试将多个UI元素的Vertical Content Compression Resistance Priority更改为999,但是总有一个UI元素的高度减小了。

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

enter image description here

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

编辑:

我发现了这个额外的空间是什么:它是“版本”标签的高度及其约束(在我的情况下,它是屏幕底部的30pts)。不幸的是,我还不能摆脱这一点-除了删除标签,这仍然不能阻止“冒出”。

1 个答案:

答案 0 :(得分:0)

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

“挤压”是由centerY - 120的{​​{1}}约束引起的,甚至无法更改“内容压缩抵抗优先级”。另外,如果周围有UIStackView,它会抱怨缺少“ y位置”约束(即使其他约束设置正确)。

不幸的是,到目前为止,我发现对两个问题都有效的唯一解决方法是消除原因并更改布局。 :/

我最终得到的结果:

enter image description here

一些值得注意的事情:

  • 添加了UIScrollView,以便始终将“版本”标签保留在屏幕底部-即使在键盘处于活动状态时也是如此。
  • Child ViewLogin View类用于其“底部”约束。没有它,滚动将被完全禁用。
  • KeyboardLayoutConstraint的大小是通过内部的标签和文本字段设置的。
  • 必须添加两个额外的Stack ViewUIStackView(1x用户名,1x服务器)以保持UIView的宽度为200,但周围仍然有{{1 }}和UITextFields使用0pts的开头/结尾约束。如果没有,所有内容都不会水平放置,Xcode就会抱怨,UIStackView非常狭窄,这也意味着不可能在侧面滚动。
  • 即使键盘向上并且UIScrollView可以滚动,“ top + 100”约束(UIScrollView)仍然可见。我知道它并不漂亮,但这是我发现的唯一不会将文本字段粘贴到视图顶部的解决方案,因为“ middle-100”不起作用。可以通过更改Stack View类来摆脱它。