在文本字段中输入文本时,文本字段在键盘下方丢弃

时间:2018-04-12 11:58:18

标签: ios swift

关于在文本字段中输入文本,我有一个奇怪的问题。我目前正在使用以下代码。我的代码是在答案here之后建模的。

class RocketViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, NSFetchedResultsControllerDelegate {

   var offsetY:CGFloat = 0

   override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(RocketViewController.keyboardFrameChangeNotification(notification:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
    }

    @objc func keyboardFrameChangeNotification(notification: Notification) {
    if let userInfo = notification.userInfo {
        let keyBoardFrame = userInfo[UIKeyboardFrameEndUserInfoKey] as? CGRect
        let animationDuration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? Double ?? 0
        let animationCurveRawValue = (userInfo[UIKeyboardAnimationCurveUserInfoKey] as? Int) ?? Int(UIViewAnimationOptions.curveEaseInOut.rawValue)
        let animationCurve = UIViewAnimationOptions(rawValue: UInt(animationCurveRawValue))
        if let _ = keyBoardFrame, keyBoardFrame!.intersects(self.mainStackView.frame) {
            self.offsetY = self.mainStackView.frame.maxY - keyBoardFrame!.minY
            UIView.animate(withDuration: animationDuration, delay: TimeInterval(0), options: animationCurve, animations: {
                self.mainStackView.frame.origin.y = self.mainStackView.frame.origin.y - self.offsetY
                self.rocketSelectTable.frame.origin.y = self.rocketSelectTable.frame.origin.y - self.offsetY
            }, completion: nil)
        } else {
            if self.offsetY != 0 {
                UIView.animate(withDuration: animationDuration, delay: TimeInterval(0), options: animationCurve, animations: {
                    self.mainStackView.frame.origin.y = self.mainStackView.frame.origin.y + self.offsetY
                    self.rocketSelectTable.frame.origin.y = self.rocketSelectTable.frame.origin.y + self.offsetY
                    self.offsetY = 0
                  }, completion: nil)
               }
           }
       }
   }
}

在我的视图中,我有一个带有获取结果控制器作为其数据源的表视图,下面是堆栈视图中的文本字段,称为mainStackView,最终保存在核心数据存储中。

我已经经历了几次这段代码的迭代,结果相同,无论是计算第一响应者的偏移量,还是只计算堆栈视图。当文本字段成为第一个响应者时,视图可以很好地与键盘一起滑动。但是,只要我尝试键入字段,视图就会快速回到原始位置。我确定我犯了一个新手的错误,但我无法弄清楚我做错了什么,而且我的搜索中没有找到任何内容,除了类似的android问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

虽然我还没有确定为什么我看到通过更改框架看到的文本字段的行为,但我能够通过使用CGAffineTransform来停止行为。我的代码现在是:

  @objc func keyboardFrameChangeNotification(notification: Notification) {
       if let userInfo = notification.userInfo {
           let keyBoardFrame = userInfo[UIKeyboardFrameEndUserInfoKey] as? CGRect
           let animationDuration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? Double ?? 0
           let animationCurveRawValue = (userInfo[UIKeyboardAnimationCurveUserInfoKey] as? Int) ?? Int(UIViewAnimationOptions.curveEaseInOut.rawValue)
           let animationCurve = UIViewAnimationOptions(rawValue: UInt(animationCurveRawValue))
           if let _ = keyBoardFrame, keyBoardFrame!.intersects(self.mainStackView.frame) {
               self.offsetY = self.mainStackView.frame.maxY - keyBoardFrame!.minY
               let transformUp = CGAffineTransform.init(translationX: 0, y: (0 - self.offsetY))
               UIView.animate(withDuration: animationDuration, delay: TimeInterval(0), options: animationCurve, animations: {
                   self.mainStackView.transform = transformUp
                   self.rocketSelectTable.transform = transformUp
               }, completion: nil)
           } else {
               if self.offsetY != 0 {
                   UIView.animate(withDuration: animationDuration, delay: TimeInterval(0), options: animationCurve, animations: {
                       self.mainStackView.transform = CGAffineTransform.identity
                       self.rocketSelectTable.transform = CGAffineTransform.identity
                       self.offsetY = 0
                   }, completion: nil)
               }
           }
       }

此代码可以平滑地动画视图的移动,并且在文本字段中键入时不会弹回原始位置。我希望这有助于其他人。