Swift 5,Xcode 10
我的UIViewController
的布局:
打开键盘时,我使用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元素的高度减小了。
如您在此屏幕截图中所见,键盘上方有足够的空间:
如何使自动布局使用此空间而不是“挤压” UI元素?
编辑:
我发现了这个额外的空间是什么:它是“版本”标签的高度及其约束(在我的情况下,它是屏幕底部的30pts)。不幸的是,我还不能摆脱这一点-除了删除标签,这仍然不能阻止“冒出”。
答案 0 :(得分:0)
键盘上方的额外空白空间等于“版本”标签的高度及其约束(在我的情况下,距离屏幕底部30pts)。
“挤压”是由centerY - 120
的{{1}}约束引起的,甚至无法更改“内容压缩抵抗优先级”。另外,如果周围有UIStackView
,它会抱怨缺少“ y位置”约束(即使其他约束设置正确)。
不幸的是,到目前为止,我发现对两个问题都有效的唯一解决方法是消除原因并更改布局。 :/
我最终得到的结果:
一些值得注意的事情:
UIScrollView
,以便始终将“版本”标签保留在屏幕底部-即使在键盘处于活动状态时也是如此。Child View
将Login View
类用于其“底部”约束。没有它,滚动将被完全禁用。KeyboardLayoutConstraint
的大小是通过内部的标签和文本字段设置的。Stack View
和UIStackView
(1x用户名,1x服务器)以保持UIView
的宽度为200,但周围仍然有{{1 }}和UITextFields
使用0pts的开头/结尾约束。如果没有,所有内容都不会水平放置,Xcode就会抱怨,UIStackView
非常狭窄,这也意味着不可能在侧面滚动。UIScrollView
可以滚动,“ top + 100”约束(UIScrollView
)仍然可见。我知道它并不漂亮,但这是我发现的唯一不会将文本字段粘贴到视图顶部的解决方案,因为“ middle-100”不起作用。可以通过更改Stack View
类来摆脱它。