swift - 计算并在键盘上移动 UIView(显示/隐藏)

标签 swift uiview swift4

如果键盘与字段重叠,我正在尝试计算移动 UITextField 及其父 UIView 的位置,并在键盘关闭后移回其原始位置。

我已经尝试过https://github.com/hackiftekhar/IQKeyboardManager它在我的特定情况下不起作用。

为了解释该问题,请引用随附的两张屏幕截图,一张是打开键盘时的屏幕截图,另一张是关闭键盘时的屏幕截图。

View Without Keyboard View With Keyboard

如您所见,在键盘打开时,文本字段与键盘重叠,我想将文本字段与弹出 View 一起移动以重新调整并位于键盘上方。

这是我尝试过的。

func textFieldDidBeginEditing(_ textField: UITextField) {
    self.startOriginY = self.frame.origin.y
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
}

@objc func keyboardWillShow(_ notification: Notification) {
    if let keyboardFrame: NSValue = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        let keyboardHeight = keyboardRectangle.height
        let screenHeight = self.backgroundView.frame.height
        let viewHeight = self.frame.height
        let diffHeight = screenHeight - viewHeight - keyboardHeight
        if diffHeight < 0 {
            self.frame.origin.y = -self.textField.frame.height
        }
    }
}

func textFieldDidEndEditing(_ textField: UITextField) {
    self.frame.origin.y = self.startOriginY
}

此代码将 View 移动到错误的位置。我试图弄清楚如何计算移动 View 并消除键盘重叠的正确位置。

解决这个问题的最佳方法是什么?

谢谢。

最佳答案

基本上,您需要将 View 嵌入 ScrollView 并使用 Apple's example通过更改 ScrollView 的底部内容插图来处理调整:

  1. 嵌入 ScrollView 内
  2. 注册键盘通知
  3. 通过更改底部内容插图实现处理通知的逻辑

我已将 Apple 的代码 snipe 转换为 Swift。

键盘将显示:

if let info = notification.userInfo,
   let size = (info[UIKeyboardFrameEndUserInfoKey] as AnyObject?) {
       let newSize = size.cgRectValue.size
       let contentInset = UIEdgeInsetsMake(0.0, 0.0, newSize.height, 0.0)
       scrollView.contentInset = contentInset
 }

键盘将隐藏:

let contentInset = UIEdgeInsets.zero
scrollView.contentInset = contentInset
scrollView.scrollIndicatorInsets = contentInset

您还可以向 newSize.height 添加硬编码偏移量,即:newSize.height + 20

关于swift - 计算并在键盘上移动 UIView(显示/隐藏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49346193/

相关文章:

ios - MeasurementFormatter 显示英尺和英寸

swift - 即使我在 swift 中使用了正确的标签,也无法访问我想要的按钮标题

swift - MKPolyLine swift 4

ios - 添加 UITableViewController.view 作为 subview 表现不佳

ios - 如何在定义的时间间隔内每天从 HealthKit 数据中获取最新的体重条目

swift - 滚动垂直堆叠的 Collection View

ios - 在 iOS 8.3 中向 UIWindow 添加 subview

json - Alamofire 打印 "Optional(data)",我怎样才能摆脱 "Optional"

ios - UIView 的 cornerRadius 不均匀影响 View

ios - 不闪烁地重新加载 UITableView 标题 View