Ios 在文本字段中输入文本时,文本字段会下降到键盘下方

Ios 在文本字段中输入文本时,文本字段会下降到键盘下方,ios,swift,Ios,Swift,关于在文本字段中输入文本,我有一个奇怪的问题。我目前正在使用下面的代码。我的代码是按照答案建模的 在我的视图中,我有一个表视图,其中一个获取的结果控制器作为其数据源,下面是堆栈视图中的文本字段,称为mainStackView,最终保存在核心数据存储中 我已经用相同的结果对这段代码进行了多次迭代,无论是计算第一响应程序的偏移量,还是简单地计算堆栈视图。当文本字段成为第一个响应者时,视图会随着键盘向上滑动。但是,只要我尝试在字段中键入,视图就会恢复到其原始位置。我确信我犯了一个新手错误,但我不知道我

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

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


我已经用相同的结果对这段代码进行了多次迭代,无论是计算第一响应程序的偏移量,还是简单地计算堆栈视图。当文本字段成为第一个响应者时,视图会随着键盘向上滑动。但是,只要我尝试在字段中键入,视图就会恢复到其原始位置。我确信我犯了一个新手错误,但我不知道我做错了什么,我在搜索中没有发现任何东西,除了一个关于android的类似问题。提前感谢。

虽然我还没有确定我在更改帧时看到的文本字段行为的原因,但我可以通过使用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)
               }
           }
       }

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

代码中的某个缩进丢失了;看到尾随的close curly了吗?上面问题中显示的代码看起来不错。我猜问题出在代码中的其他地方,您没有添加到问题中。也许你可以补充一些细节?我真的不知道要补充什么。我有用于表视图的标准委托方法。有7个文本字段和相应的标签。我关心的是一个在其中一个文本字段中执行自动完成的函数,但我没有做任何更改就将其注释掉了。另一个处理文本字段的函数是
@IBAction func didEndEditing
,该函数由IB发送的“editing did end”事件触发。我还在每个函数中放置断点,并且不调用任何断点。我希望我发布的代码中有一些错误导致了它。
  @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)
               }
           }
       }