0

好的,所以我试图在我的视图中实现一个添加评论框。这是布局:

我有一个UITabBarController包含UINavigationControllerUIViewController的被推到的地方。视图布局由 a和一个包含 a和UITableViewa 的自定义组成。UIViewUITextViewUIButton

我正在监视键盘通知,这是我拥有的代码:

override func viewDidAppear(animated: Bool) {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillAppear), name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillDisappear), name: UIKeyboardWillHideNotification, object: nil)
}

override func viewDidDisappear(animated: Bool) {
    NSNotificationCenter.defaultCenter().removeObserver(self)

}

func keyboardWillAppear(notification: NSNotification){
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        var frame = inputPanel.frame
        frame.origin.y = self.view.frame.height - (keyboardSize.height + inputPanel.frame.size.height)
        inputPanel.frame = frame
    }
}

func keyboardWillDisappear(notification: NSNotification){
    var frame = inputPanel.frame
    frame.origin.y = self.view.frame.height - inputPanel.frame.size.height
    inputPanel.frame = frame
}

当键盘显示时,我设置了断点并看到 y 坐标已更新,但我的视图保持在原来的位置,隐藏在键盘后面。

一些笔记。我正在使用IQKeyboardManager并且禁用了此类的距离处理。我也PureLayout用于在 custom 中布置控件UIView。我没有为UIView视图控制器中的自定义设置任何约束。UITableView和自定义的位置UIViewviewWillLayoutSubview方法中设置如下:

override func viewWillLayoutSubviews() {
    let y = self.view.frame.height - 44
    self.tableView.frame = CGRectMake(0, 0, self.view.frame.width, y)
    self.inputPanel.frame = CGRectMake(0, y, self.view.frame.width, 44)
}

另一方面,这在我认为不是UINavigationController.

正在发生的事情的屏幕截图:

带有输入视图的视图:

带有输入视图的视图

显示键盘时:

显示键盘

任何帮助是极大的赞赏。

4

3 回答 3

1

对于未应用约束的视图,您需要在设置框架之前告诉自动布局引擎您将使用框架。您可以通过设置translatesAutoresizingMaskIntoConstraints为 true 来做到这一点。例如:

override func viewWillLayoutSubviews() {
    let y = self.view.frame.height - 44
    self.tableView.translatesAutoresizingMaskIntoConstraints = true
    self.tableView.frame = CGRectMake(0, 0, self.view.frame.width, y)
    self.inputPanel.translatesAutoresizingMaskIntoConstraints = true
    self.inputPanel.frame = CGRectMake(0, y, self.view.frame.width, 44)
}
于 2016-04-24T22:51:47.307 回答
0

尝试从功能中删除viewWillLayoutSubviewsviewDidLoad代码

override func viewDidLoad() {
    super.viewDidLoad()

    let y = self.view.frame.height - 44
    self.tableView.frame = CGRectMake(0, 0, self.view.frame.width, y)
    self.inputPanel.frame = CGRectMake(0, y, self.view.frame.width, 44)
}

我猜viewWillLayoutSubviews在键盘确实出现事件后调用了函数。

于 2016-04-24T21:38:21.600 回答
0

尝试使用 UIKeyboardFrameEndUserInfoKey 代替 UIKeyboardFrameBeginUserInfoKey

于 2016-04-24T22:51:31.043 回答