iOS开发Swift

Swift-UIScrollView中的keyboard适配-如何在弹出软键盘时把view向上移动键盘的高度

默认情况下,弹出软键盘时,UIScrollView(包含他的子类UITableView,UITextView,UICollectionView等)是不会自动上移的,这样会导致屏幕里靠下的内容会被软键盘挡住,用户无法实时看到自己当前输入的内容。

解决方案:让UIScrollView在软键盘弹出的时候向上移动键盘的高度

1.以UIScrollView为例,注册两个观察者,分别监测键盘消失和键盘出现:

@IBOutlet weak var textView: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(adjustKeyboard), name: UIResponder.keyboardWillHideNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(adjustKeyboard), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
    
}

2.实现方法:

@objc func adjustKeyboard(notification: Notification) {
        
        guard let keyboardValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }

        let keyboardScreenEndFrame = keyboardValue.cgRectValue
        let keyboardViewEndFrame = view.convert(keyboardScreenEndFrame, from: view.window)

        if notification.name == UIResponder.keyboardWillHideNotification {
            self.scrollView.contentInset = .zero
        } else {
            // 其实就是调整内边距的bottom
            self.scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyboardViewEndFrame.height - view.safeAreaInsets.bottom, right: 0)
        }

        self.scrollView.scrollIndicatorInsets = self.scrollView.contentInset // 保证滚动条和内容相对应

        let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.height + scrollView.contentInset.bottom)
        
        // 滚动到底部
        scrollView.setContentOffset(bottomOffset, animated: true)
    }

注:

大多数情况,我们的UITextView都是约束在safearea里面的,所以在上述调整内边距bottom的核心代码中,需减去view.safeAreaInsets.bottom,不然软键盘和UITextView内容之间会有个空档(即bottom内边距太大,要减去一部分):