【问题标题】:Showing Textfield when Keyboard is up键盘启动时显示文本字段
【发布时间】:2016-06-11 08:55:05
【问题描述】:

我知道我发布的问题已经被讨论了很多,但据我在 SO 中搜索,我找不到特定于我的问题的解决方案。我发布这个以获得一些输入。

问题:

视图层次结构: View -> ScrollView -> View -> Textfield

我已经实现了两个屏幕,在滚动视图顶部放置了多个文本字段,以避免当文本字段位于页面底部时键盘遮挡文本字段。我使用 Apple 提供的示例代码稍作修改就实现了这一点。

  1. 订阅UIKeyboardWillShowNotificationUIKeyboardWillHideNotification
  2. 显示键盘时,从userInfo 字典中获取键盘高度并设置适当的内容插入以将文本字段移动到键盘上方
  3. 隐藏键盘时,将内容插入设置为UIEdgeInsetZero 以恢复正常大小

当有更多的文本字段可以占据整个屏幕时,上述实现工作得非常好(假设有 10 个文本字段并且它们超出了滚动视图的框架)。每当我点击文本字段时,它会按预期移动到键盘上方,我还可以滚动页面直到最底部的文本字段在键盘框架上方可见(当键盘仍在向上时)。

当我在滚动视图中只有两个在屏幕上垂直居中的文本字段时,我的问题就出现了。当我点击文本字段时,滚动视图会获得一个与键盘高度等效的插图,并且它会按预期移动到键盘上方,但是当我滚动屏幕时,我可以在文本字段下方看到一个巨大的空白区域(由于附加的插图)。

当页面中只有一两个文本字段时,如何避免出现空白?我是否必须编写不同的逻辑来处理这种情况?任何帮助,将不胜感激。

下面是代码:

    override func viewDidLoad() {
        super.viewDidLoad()

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
    }


    func keyboardWillShow(notification: NSNotification) {
        if let userInfo = notification.userInfo {
            let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
            if let kbFrame = keyboardFrame {

                let inset = CGRectGetHeight(kbFrame)
                scrollView.contentInset = UIEdgeInsetsMake(0, 0, inset, 0)
                scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, inset, 0)
            }
        }
    }

    func keyboardWillHide(notfication: NSNotification) {
        scrollView.contentInset = UIEdgeInsetsZero
        scrollView.scrollIndicatorInsets = UIEdgeInsetsZero
    }

【问题讨论】:

标签: ios swift uiscrollview keyboard uitextfield


【解决方案1】:

TPKeyboardAvoidingScrollView 不错,但我最近切换到 IQKeyboardManager -> https://github.com/hackiftekhar/IQKeyboardManager

由您选择,但我更喜欢 IQKeyboardManager,因为它很容易

【讨论】:

  • 你觉得它更好还是仅仅因为你调用它一次而不是设置你想使用它的类?
【解决方案2】:

有很多解决方案,但我更喜欢使用TPKeyboardAvoiding。要在此处使用它,您只需在 SB 或代码中将 UIScrollView 设为 TPKeyboardAvoidingScrollView 的实例或子类,其余部分由它处理,无需其他代码!

【讨论】:

  • 谢谢。我会看看解决方案,但我想自己做,并从这个过程中学习。我可以浏览工具中的代码,但有任何解决方案来实现它吗?
  • 你可以做到,我们非常欢迎你,但这是一个痛苦的房子,我尝试过但失败了。
猜你喜欢
  • 2015-08-20
  • 1970-01-01
  • 2020-05-17
  • 2021-04-02
  • 1970-01-01
  • 2018-04-20
  • 2014-10-12
  • 1970-01-01
  • 2021-03-26
相关资源
最近更新 更多