💻
[UIKit * Autolayout]キーボードがかくれる時にUIScrollViewをスクロールさせるやり方
[UIKit * Auto Layout]キーボードがかくれる時にUIScrollViewをスクロールさせるやり方
- keyboardのNSNotificationを登録する
- UIScrollViewのbottomの制約を操作できるようにしておく。(propertyで持っておく)
- キーボードの出しわけの時に制約を変更して、
setNeedsLayout()
,layoutIfNeeded()
をよぶ。
private func setupNotifications() {
let notification = NotificationCenter.default
notification.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
notification.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}
@objc private func keyboardWillShow(notification: NSNotification) {
guard let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return }
scrollViewBottomConstraint.constant = keyboardFrame.height
view.setNeedsLayout()
view.layoutIfNeeded()
}
@objc private func keyboardWillHide(notification: NSNotification) {
scrollViewBottomConstraint.constant = 0
view.setNeedsLayout()
view.layoutIfNeeded()
}
余談
- iOS 14以降のSwiftUIでは
ScrollView
を使うとこの辺りの操作は自動でしてくれる - UIKitの場合、UITableViewControllerの中にUITextFieldを設置するとこの処理を自動でやってくれるが、UITableViewControllerのViewの大きさはカスタマイズしにくいため、そこのトレードオフがある。
Discussion