iOS Swift3使用键盘移动文本字段和容器视图

iOS Swift3使用键盘移动文本字段和容器视图,ios,uitableview,scroll,swift3,ios-autolayout,Ios,Uitableview,Scroll,Swift3,Ios Autolayout,我需要帮助使我的聊天视图控制器在打开和关闭键盘时的行为与Whatsapp相同。这意味着:如果打开键盘,视图将向上移动。如果关闭,它将返回到原始位置 我已经拥有的内容:我的聊天视图控制器有一个ContainerView,在该ContainerView下面是一个文本字段。我已经设置了两个观察员,他们正在捕获UIKeyboardWillShow和UIKeyboardWillHide。ContainerView和TextField在顶部、左侧、右侧和底部都有约束。它们之间是垂直间距 我所尝试的d:我接受

我需要帮助使我的聊天视图控制器在打开和关闭键盘时的行为与Whatsapp相同。这意味着:如果打开键盘,视图将向上移动。如果关闭,它将返回到原始位置

我已经拥有的内容:我的聊天视图控制器有一个ContainerView,在该ContainerView下面是一个文本字段。我已经设置了两个观察员,他们正在捕获UIKeyboardWillShow和UIKeyboardWillHide。ContainerView和TextField在顶部、左侧、右侧和底部都有约束。它们之间是垂直间距

我所尝试的d:我接受了文本字段的底部约束,并将键盘的高度添加到其中。它动作正确

我需要帮助的地方:ContainerView中的TableView无法与文本字段一起正确移动。以下是一些显示我的问题的屏幕截图:

键盘似乎覆盖在ContainerView上。但ContainerView中的TableView似乎把它搞砸了

我希望单击文本字段时会显示“感谢您阅读示例消息”,但它会被剪切。我想每次你打开键盘时都会向下滚动到底部,但是如果你在聊天过程中想输入一些东西,你想呆在你所看到的地方,那就行不通了


感谢您阅读本文,并感谢您的帮助

有两种方法可以实现您想要实现的目标:

  • 以编程方式修改底部约束常量以包括键盘的高度。这会将tableview的底部固定到顶部

  • 我将使用的方法是在tableview中添加一个与键盘高度相等的内容插入。这种方法更简单,因为它不需要修改视图约束常量

  • 这样开始:

    override func viewDidLoad(){
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardShow), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
    }
    
    func keyboardShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            self.tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
        }
    }
    
    func keyboardHide(notification: NSNotification) {
        self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
    }
    

    请注意,如果要将内容推到文本字段的底部,请将文本字段高度添加到键盘高度。

    这在iOS 10上效果很好,但在iOS 11 beta 6上效果不佳。使用
    UIKeyboardFrameEndUserInfoKey
    使其适用于两个版本。