ios - 仅当隐藏文本字段时才使用键盘移动 View

标签 ios swift user-interface uiscrollview keyboard

我试图让我的应用程序在键盘出现时移动 View ,到目前为止,结果是……至少可以说是喜忧参半。我可以让它移动,问题是它要么是硬编码的,要么只能部分工作。

我的 View 中有多个文本字段,当我点击它们时,有时取决于我滚动的位置,它会被键盘隐藏。

现在我需要我的应用程序做的是仅当事件文本字段被键盘隐藏时才移动 View 以查看文本字段。

我的 View 层次结构是这样的:

Scene Hierarchy

所以我有一个 ScrollView ,在 ScrollView 中我有一个名为 ContentView 的 UIView,在 ContentView 中我有我所有的文本字段和标签。

问题是,我无法对其进行硬编码,因为我的应用程序是通用的,我需要让键盘仅在隐藏文本字段时移动 View 。因为在用户使用 iPad 的情况下,View 可能永远不需要移动

我使用了以下 Stack overflow 答案但没有结果:

Swift: Scroll View only when a TextField or Button is hidden by the Keyboard

Move view with keyboard using Swift

这是我的代码,实际上来自其中一个答案:

override func viewDidLoad() {
    super.viewDidLoad()

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

}



func keyboardWillShow(notification:NSNotification) {
    if keyboardIsPresent == false {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            self.ContentView.frame.origin.y -= keyboardSize.height
            keyboardIsPresent = true
        }
    }
}

func keyboardWillHide(notification:NSNotification) {
    if keyboardIsPresent == true {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            self.ContentView.frame.origin.y += keyboardSize.height
            keyboardIsPresent = false
        }
    }
}

我几乎 100% 确定我的所有错误都来自于我有一个 ContentView 的事实......但我需要它。预先感谢您的帮助

最佳答案

当键盘出现时,您不应该修改框架

相反,您需要将 ScrollView scrollView.contentInset.bottom 的底部插图设置为,从零到键盘高度。当键盘消失时,您将插图设置回零。

整个问题只需 10 行代码即可解决。

从通知中获取键盘高度,在 KB 显示时将其存储在类中的局部变量中,并使用该值在委托(delegate)回调/事件处理程序方法中设置插入。

这里的诀窍是设置非零插入将有效地滚动 ScrollView 以及内容,这也会将当前文本字段向上推。

关于ios - 仅当隐藏文本字段时才使用键盘移动 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36405752/

相关文章:

Android - Andengine - 如何使用原生UI SKD

java - 使用 AWT 关闭一个框架(不是整个应用程序)

objective-c - UITextView:键入退格键时,字符计数不正确

ios - 如何在 IOS 中的 <div> 标签上放置一个链接

swift - Xcode6 Swift 添加远程推送通知并从 PHP 发送

没有参数标签的 Swift 函数

ios - 是否可以禁用滑动手势并仅使平移手势在 ScrollView 中工作?

ios - 获取有关请求位置权限的错误

swift - 二元运算符 '!==' 不能应用于两个 'MyProtocol'

Java JFrame 根据屏幕分辨率调整大小