【问题标题】:Is it possible to "push up" the entire app when keyboard appear?键盘出现时是否可以“向上推”整个应用程序?
【发布时间】:2020-12-29 18:39:21
【问题描述】:

目前,我有一个UICollectionView,其中多行UITextField

当底部UITextField时,键盘会遮挡其可见性。

为了使UICollectionView 仍然可以滚动到底部,引入​​了许多技术


大多数解决方案是

  1. 计算键盘高度。
  2. 调整UICollectionViewcontentInsetscrollIndicatorInsets

但是,如果我的屏幕由UICollectionView 和底部UIView 组成,这种解决方案效果不佳。


键盘隐藏时

--------------------
|                  |
|                  |
|                  |
|                  |
| UICollectionView |
|                  |
|                  |
|                  |
|                  |
--------------------
|                  |
|  Custom UIView   |
|                  |
-------------------- 

显示键盘时(我的期望)

--------------------
|                  |
|                  |
| UICollectionView |
|                  |
|                  |
--------------------
|                  |
|  Custom UIView   |
|                  |
-------------------- 
|                  |
|                  |
|  Keyboard        |
|                  |
--------------------

但是,当前提供的解决方案只能“推高”UIScrollView/UICollectionView

我倾向于“推高”整个主要的UIView。不幸的是,UIView 没有contentInset 可供我根据键盘高度采取行动。

这是我目前使用https://github.com/hackiftekhar/IQKeyboardManager 的结果。如果我应用https://stackoverflow.com/a/32353069/72437的解决方案,结果是一样的


键盘隐藏时


显示键盘时。只有 UICollectionView 被向上推。底部UIView 将被“覆盖”


知道如何“向上推”整个应用程序屏幕,而不仅仅是 UICollectionView/ UIScrollView

【问题讨论】:

  • 你甚至不需要处理插入,只需计算键盘高度,然后改变bottomMostView-to-superView约束的常量,整个视图就会向上推。
  • 我会考虑使用solution that adjusts the safeAreaLayoutGuide,以便它适用于所有设备。
  • @Wez 感谢您的指点。我也会看看他们。事实上,我认为这应该是操作系统的责任,以确保键盘不会掩盖应用程序。它不应该要求应用程序开发人员进行所有丑陋的手动处理。 1 万亿美元的公司应该更清楚这一点。

标签: ios swift


【解决方案1】:

最受欢迎的答案之一 (https://stackoverflow.com/a/31124676/72437) 是调整视图的 Y。

但是,如果视图内的 UI 组件之一是 UICollectionView,则这是一个错误解决方案。调整视图的 Y 后,您将无法滚动到列表的开头。

正确的解决方案应该是调整视图的高度。

private var originalSize: CGSize?

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self)
}

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        if self.originalSize == nil {
            let originalSize = self.view.frame.size
            self.originalSize = originalSize
            self.view.frame.size = CGSize(
                width: originalSize.width,
                height: originalSize.height - keyboardSize.height
            )
        }
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    if let originalSize = self.originalSize {
        self.view.frame.size = originalSize
        self.originalSize = nil
    }
}

【讨论】:

    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多