ios - 键盘启动时显示文本字段

标签 ios swift uiscrollview keyboard uitextfield

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

问题:

View hierarchy: View -> ScrollView -> View -> Textfield

我已经实现了两个屏幕,其中多个文本字段位于 ScrollView 的顶部,以避免键盘在页面底部遮挡文本字段。我使用 Apple 提供的示例代码稍加修改就实现了这一点。

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

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

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

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

代码如下:

    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
    }

最佳答案

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

由你来选择,但我更喜欢 IQKeyboardManager,因为它很简单

关于ios - 键盘启动时显示文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35680568/

相关文章:

ios - 如何使用UIScrollView在钢琴应用程序中滚动 Octave 音

ios - 使用 MPMoviePlayer 请求视频缩略图的问题

ios - 由于列表,导航 View 的背景颜色未显示

ios - 已弃用的 AVCaptureConnection 帧持续时间属性的替代方案?

ios - 横向展开的uiscrollview还是uitableview?

ios - 在 iPhone 的单个 View Controller 中的一个 UIScrollView 中添加两个表

ios - 在 Swift UIscrollview 中设置 View Controller 的形状

iphone - 可达性 block 应用

swift - 如何在 SwiftUI 中异步请求完成后调用函数?

arrays - 有没有 O(1) 的方法从 Swift 集合中删除 nil 值?