键盘启动时显示文本字段

时间:2016-02-28 09:01:05

标签: ios swift uiscrollview keyboard uitextfield

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

问题:

  

查看层次结构: 查看 - > ScrollView - >查看 - >文本框

我已经实现了两个屏幕,其中多个文本字段放在滚动视图的顶部,以避免键盘在页面底部遮挡文本字段。我使用Apple提供的示例代码进行了少量修改。

  1. 订阅UIKeyboardWillShowNotificationUIKeyboardWillHideNotification
  2. 显示键盘时,从userInfo字典中获取键盘的高度并设置适当的内容插入以将键盘上方的文本字段移动
  3. 隐藏键盘时,将内容插入设置为UIEdgeInsetZero以恢复正常大小
  4. 当有更多的文本字段可以占据整个屏幕时,上述实现工作得非常好(假设有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
        }
    

2 个答案:

答案 0 :(得分:1)

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

它可以选择,但我更喜欢IQKeyboardManager,因为它很容易

答案 1 :(得分:0)

有很多解决方案,但我首选的解决方案是使用TPKeyboardAvoiding。要在此处使用它,您只需在SB或代码中创建k UIScrollView的实例或子类,它应该关注其余部分,不需要其他代码!