iOS:无需监听键盘通知,设置视图与屏幕或键盘的底部间距
问题描述:
在Android中,您可以使用RelativeLayout,通过layout_alignParentBottom将视图(如按钮)固定在布局底部,键盘弹出时视图会自动位于键盘上方。
请问在iOS中,是否存在无需订阅键盘事件、无需根据键盘高度调整视图约束的实现方式?
我提出此问题是因为所见示例均需订阅键盘事件,但根据我的经验这种方式易出问题,还需处理应用全局事件。
补充说明:我询问的是严格符合上述需求的方案,而非添加inputAccessoryView。我希望视图(无论按钮、图片或其他控件)始终与屏幕底部保持固定间距;键盘弹出时,视图与键盘顶部保持该固定间距;键盘消失时,视图回到原位置。
回答:
嘿,这个问题问到点子上了——监听键盘事件确实是个容易踩坑的活儿,比如键盘弹出延迟、第三方键盘高度异常、屏幕旋转时的适配问题,稍不注意就出bug。刚好iOS里确实有完全符合你需求的无监听方案,不用碰键盘通知,也不用手动调约束:
方案1:基于UIScrollView的原生自动适配
这是最通用的方案,不管你底部放的是按钮、图片还是其他控件都适用:
- 把整个界面的所有元素(包括你要固定的底部视图)都放进一个
UIScrollView里 - 给scrollView设置全屏约束:顶部、底部、左侧、右侧都和父视图的Safe Area对齐
- 给scrollView内部的contentView(或者直接是你的子视图)设置约束,确保内容布局逻辑正常——比如contentView宽度和scrollView一致,高度根据内容自适应,同时让底部视图和contentView底部保持你想要的固定间距
- 确保scrollView的
contentInsetAdjustmentBehavior属性设置为.automatic(iOS 11及以上版本默认就是这个值,但显式设置更稳妥)
这样一来,当键盘弹出时,系统会自动调整scrollView的contentInset和scrollIndicatorInsets,把底部视图“推”到键盘顶部,刚好保持你设置的间距;键盘消失时又会自动恢复原位,全程不需要你写一行键盘监听的代码。
方案2:利用UITableView/UICollectionView的内置特性
如果你的界面本身是列表形式(比如聊天界面、表单界面),直接用列表控件更省心:
- 把需要固定的底部视图设置为
UITableView的tableFooterView,或者UICollectionView的section footer - 给列表控件设置全屏约束,同样确保
contentInsetAdjustmentBehavior = .automatic
系统会自动处理键盘弹出时的footer位置调整,原理和scrollView完全一致,而且还能复用列表的滚动特性,一举两得。
这两个方案都是iOS系统原生支持的,完全避开了手动监听键盘事件的各种坑,完美匹配你想要的效果。
内容的提问来源于stack exchange,提问作者Micro

