Swift:键盘弹出时如何上移含TextField与Button的UIView
嗨,这个问题我之前做聊天界面的时候也碰到过,确实挺闹心的——键盘一弹出来直接把发送按钮给挡得严严实实,用户根本没法操作。下面给你几个靠谱的解决办法,你可以根据自己的iOS版本兼容需求来选:
方法1:用iOS 15+的UIKeyboardLayoutGuide(最省心)
如果你的APP只需要支持iOS 15及以上,这个方法绝对是首选,完全不用手动写键盘监听代码。
只需要给你的底部输入UIView调整一下底部约束:把原来绑定到view.safeAreaLayoutGuide.bottomAnchor或者view.bottomAnchor的约束,改成绑定到view.keyboardLayoutGuide.topAnchor。
这样系统会自动帮你处理键盘弹出、收起时的位置调整,连动画都帮你做好了,省心到爆炸。
方法2:监听键盘通知(兼容旧版本iOS)
如果要支持iOS 15以下,就得手动监听键盘的弹出和收起事件,通过调整约束来移动输入View。
首先,在viewDidLoad里注册键盘通知:
override func viewDidLoad() { super.viewDidLoad() // 你的原有代码... // 注册键盘弹出/收起通知 NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil) }
然后实现两个处理键盘事件的方法,还要记得在页面销毁时移除通知避免内存泄漏:
// 键盘即将弹出时,调整输入View的位置 @objc private func keyboardWillShow(_ notification: Notification) { guard let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return } // 把键盘的frame转换成当前View的坐标系,获取准确的键盘高度 let keyboardHeight = view.convert(keyboardFrame, from: nil).height // 假设你给底部输入View的底部约束创建了IBOutlet,命名为inputViewBottomConstraint inputViewBottomConstraint.constant = -keyboardHeight // 用动画同步键盘弹出的节奏,看起来更自然 UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() // 顺便让TableView滚动到底部,避免最新消息被键盘挡住 if self.messages.count > 0 { let lastIndexPath = IndexPath(row: self.messages.count - 1, section: 0) self.tableView.scrollToRow(at: lastIndexPath, at: .bottom, animated: true) } } } // 键盘收起时,恢复输入View的原始位置 @objc private func keyboardWillHide(_ notification: Notification) { inputViewBottomConstraint.constant = 0 UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() } } // 页面销毁时移除通知,防止内存泄漏 deinit { NotificationCenter.default.removeObserver(self) }
这里要注意:你需要在Storyboard或者代码里给底部输入View的底部约束创建一个IBOutlet,命名为inputViewBottomConstraint,不然没法动态调整它的constant值。
额外小提示
- 如果你用的是
UITableViewController,可以设置tableView.keyboardDismissMode = .interactive,这样用户拖动TableView就能收起键盘,体验更好;不过这个只能处理TableView的内容偏移,你的底部输入View还是需要上面的方法来调整位置。 - 点击发送按钮后,记得调用
inputTextField.resignFirstResponder()收起键盘,这样输入View会自动回到原来的位置。
内容的提问来源于stack exchange,提问作者William Loke
相关产品推荐
相关产品推荐

