【问题标题】:Text Field Drops Below Keyboard Upon Entering Text in Text Field在文本字段中输入文本时,文本字段会落在键盘下方
【发布时间】:2018-04-15 23:56:54
【问题描述】:

在将文本输入文本字段时,我遇到了一个奇怪的问题。我目前正在使用下面的代码。我的代码是根据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。提前致谢。

【问题讨论】:

  • 代码中某处的缩进丢失了;看到尾随关闭卷曲?
  • 您上面问题中显示的代码看起来不错。我想问题出在代码中您没有添加到问题中的其他地方。也许您可以添加更多细节?
  • 我真的不确定要添加什么。我有表格视图的标准委托方法。有 7 个文本字段和相应的标签。我担心在其中一个文本字段中执行自动完成功能的功能,但我将其注释掉,没有任何变化。唯一处理文本字段的其他函数是@IBAction func didEndEditing,它由 IB 发送的“编辑结束”事件触发。我还在每个函数中都设置了断点,并且没有一个被调用。我希望我发布的代码中有一些错误导致它。

标签: ios swift


【解决方案1】:

虽然我还没有确定为什么我会在更改框架时看到文本字段的行为,但我能够通过使用 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)
               }
           }
       }

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

【讨论】:

    猜你喜欢
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多