当键盘出现时滑动桌面视图

时间:2017-02-21 16:41:41

标签: ios swift uitableview autolayout

我正在尝试滑动一个位于tableview底部的文本框(实际上是在页脚视图中)。所以我尝试了两种方法:

  1. 动画自动布局约束
  2. 为tableview设置动画内容插件
  3. 但是,他们没有工作或部分工作。目前,我无法在真正的iPad上测试这个(应用程序仅限iPad),我正在模拟器上测试,但我认为这样的事情应该有效:

    1. 动画内容设置

      func keyboardWillShow(notification: NSNotification) {
          if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
              UIView.animate(withDuration: 0.2, animations: {
                  self.tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
              })
          }
      }
      
      func keyboardWillHide(notification: NSNotification) {
          UIView.animate(withDuration: 0.2, animations: {
              self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
          })
      }
      
    2. 动画自动布局约束

      func keyboardWillShow(notification: NSNotification) {
          if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
              UIView.animate(withDuration: 0.2, animations: {
                  self.bottomTableviewConstraint.constant = keyboardHeight
                  self.qaTableview.layoutIfNeeded()
              })
          }
      }
      
      func keyboardWillHide(notification: NSNotification) {
          UIView.animate(withDuration: 0.2, animations: {
              self.bottomTableviewConstraint.constant = 0
              self.qaTableview.layoutIfNeeded()
          })
      }
      
    3. 所以在第一个例子中,我从未注意到动画,也没有注意到tableview内容的移动。在第二个例子中,我做了一个autolayout约束的出口(底部垂直间距),但我得到一些奇怪的结果。例如,tableview向上移动,但不是完全移动,而且只是第一次。

      如果我设置断点,keyboardHeight等于471。我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:3)

这是我尝试过的,它按预期工作得非常好。

您可以查看添加通知中心的位置吗?

- 动画内容设置

override func viewWillAppear(_ animated: Bool) {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func keyboardWillShow(notification: NSNotification) {
    if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
        UIView.animate(withDuration: 0.2, animations: {
            self.tbl.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
        })
    }
}

func keyboardWillHide(notification: NSNotification) {
    UIView.animate(withDuration: 0.2, animations: {
        self.tbl.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
    })
}

- 动画自动布局约束

确保您没有在故事板中为UITableView设置底部布局和高度约束。

<强>

但是,只需使用UITableViewController,就可以更轻松地完成此操作。它默认会处理此功能。当然,如果您在使用它时没有问题。

<强> 修改

UITextView的行为与UITextField略有不同。为delegate设置UITextView。并在textViewShouldBeginEditing中执行所有表格视图对齐。

extension ViewController: UITextViewDelegate {
    func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
        let pointInTable:CGPoint = textView.superview!.convert(textView.frame.origin, to: tbl)
        tbl.contentOffset = CGPoint(x: tbl.contentOffset.x, y: pointInTable.y)
        return true
    }
}

答案 1 :(得分:0)

我使用IQKeyboardManager库来处理这种行为:https://github.com/hackiftekhar/IQKeyboardManager

IQKeyboardManager允许您防止键盘向上滑动并覆盖UITextField / UITextView,而无需您输入任何代码,也无需其他设置。要使用IQKeyboardManager,只需将源文件添加到项目中即可。

实施起来非常简单。使用pod导入库,然后在AppDelegate中添加:

import IQKeyboardManager

在didFinishLaunchingWithOptions中:

IQKeyboardManager.sharedManager().enable = true