努力在 Swift 中实现 iOS 键盘的动态视图大小调整

问题描述 投票:0回答:1

当我点击文本字段时,键盘会出现,但它会覆盖文本字段,导致输入文本变得困难。 我尝试将视图控制器中的 adjustmentResize 设置为 true,但它似乎没有按预期工作。 我还尝试处理键盘通知并调整内容插图并滚动视图,但它没有给出所需的结果。

override func viewDidLoad() {
    super.viewDidLoad()
    // Other setup code...

    // I've tried the following, but it doesn't solve the issue
    self.view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    self.view.contentMode = .redraw
}

我希望在键盘出现时适当调整视图大小并滚动,确保文本字段保持可见且可访问。如何使用 Swift 在我的 iOS 应用程序中实现此行为?

ios swift uikit resize uikeyboard
1个回答
0
投票

解决iOS键盘无法调整视图大小和与文本字段重叠的问题。这对我有用

注册键盘通知

在 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)

手柄键盘展示

实现keyboardWillShow方法来调整内容插入,并在即将显示键盘时滚动视图。

@objc private func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
        yourScrollView.contentInset = contentInsets
        yourScrollView.scrollIndicatorInsets = contentInsets
    }
}

手柄键盘隐藏

实现keyboardWillHide方法,在键盘即将隐藏时重置内容插入并滚动视图。

@objc private func keyboardWillHide(notification: NSNotification) {
    let contentInsets = UIEdgeInsets.zero
    yourScrollView.contentInset = contentInsets
    yourScrollView.scrollIndicatorInsets = contentInsets
}

取消注册键盘通知

deinit {
    NotificationCenter.default.removeObserver(self)
}

滚动到活动文本字段

此外,您可能需要滚动到活动文本字段以确保它在键盘出现时可见。

func scrollToActiveTextField() {
    if let activeTextField = yourActiveTextField {
        let visibleRect = CGRect(origin: activeTextField.frame.origin, size: CGSize(width: activeTextField.frame.width, height: activeTextField.frame.height + 20))
        yourScrollView.scrollRectToVisible(visibleRect, animated: true)
    }
}

当您检测到文本字段变为活动状态时,调用 scrollToActiveTextField()

© www.soinside.com 2019 - 2024. All rights reserved.