💻

[UIKit * Autolayout]キーボードがかくれる時にUIScrollViewをスクロールさせるやり方

2021/02/08に公開

[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