【问题标题】:Keyboard move up and down键盘上下移动
【发布时间】:2017-03-24 01:03:02
【问题描述】:

我有一个 loginView,里面有两个 textField 和一个按钮。我必须在点击 textField 时向上移动视图,并在按下返回键时向下移动视图。

我的问题是它在所有条件下都可以正常工作,但是当点击一个 textField 视图时,它会向上移动,但同时当我们进入下一个 textField 视图时,它会向下移动。

import UIKit
class CheckFontIconView: UIViewController,UITextFieldDelegate {

    var activeField: UITextField?

    @IBOutlet weak var loginFieldsView: UIView!

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var mobileNo: UITextField!
    @IBOutlet weak var textFieldPassword: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        mobileNo.delegate = self
        textFieldPassword.delegate = self

        registerForKeyboardNotifications()
    }

    @IBAction func btnLoginAction(_ sender: Any) {

    }

    deinit {

        //NotificationCenter.default.removeObserver(self)
        self.deregisterFromKeyboardNotifications()
    }


    func registerForKeyboardNotifications() {

        //Adding notifies on keyboard appearing
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    func deregisterFromKeyboardNotifications() {

        //Removing notifies on keyboard appearing
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    func keyboardWasShown(notification: NSNotification) {

        //Need to calculate keyboard exact size due to Apple suggestions
        var info = notification.userInfo!
        let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
        if self.activeField != nil {
            self.loginFieldsView.frame.origin.y -= (keyboardSize?.height)!
        }
    }

    func keyboardWillBeHidden(notification: NSNotification) {

        //Once keyboard disappears, restore original positions
        var info = notification.userInfo!
        let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
        self.loginFieldsView.frame.origin.y -= (keyboardSize?.height)!
        self.loginFieldsView.endEditing(true)
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
        self.activeField = textField
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        self.activeField = nil

    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        activeField?.resignFirstResponder()
        return true
    }
}

【问题讨论】:

  • 最简单的方法是制作一个标志来标记您的键盘是否显示。因此,在未显示或案例移动到下一个文本字段的情况下处理它。
  • 是的,我尝试了之前设置标志的方法,但同样的问题来了。
  • 如果您将在登录视图中使用 UIScrollView,那么您的问题可能会得到解决。
  • 我尝试运行您的代码,但当我选择第一个文本字段时出现问题,当显示键盘时,我继续选择第二个文本字段,您的视图又向上移动了一次。所以我认为你应该改变你的计算方法。
  • 在我看来,您应该存储原始视图框架值和移动的视图框架以进行切换,而不是使用self.loginFieldsView.frame.origin.y -= (keyboardSize?.height)!

标签: ios view keyboard uitextfield swift3


【解决方案1】:

尝试一下scrollView,希望对你有帮助。

使用滚动视图上下移动文本字段。

化妆

  1. 制作一个@IBOutlet 弱变量滚动条:UIScrollView!;
  2. 在 textFieldDidBeginEditing:textField 方法下
  3. 使用 x: 0 和 y texfield.frame.origin.y 创建一个 CGPoint
  4. 然后使用 setContentOffset:animated 函数开始移动滚动条。(参数将是您的 CGPoint 和布尔值 true)。

放下

  1. 在 textFieldDidEndEditing:textField 下,使用相同的 setContentOffset:animated 函数将滚动条设置为 CGPoint.zero。

*您的 textFieldShouldReturn:textField 应该是 resignFirstResponder 或下一个 textField。

如果对此有任何问题,请告诉我。

【讨论】:

  • 但是我只有两个textField,为什么要使用scrollView。谢谢
  • 您的担心是正确的,但无论如何,您想向右移动视图吗?如果您使用 scrollView,它将帮助您根据键盘移动上下滚动。
【解决方案2】:

感谢提问...

使用TPKeyboard实现以上功能就不用管这种东西了(由TPKeyboard自动管理)...

更新:

我认为你在下面给出的代码中犯了一些错误......

func textFieldDidEndEditing(_ textField: UITextField) {
        self.activeField = nil
 }

您必须调试并确定确切的问题..

编码愉快...

【讨论】:

  • 我不想使用任何库。
  • 我调试但没有遇到问题。
  • 是的,我该怎么做
  • 请将您的项目上传到 google drive 或 GitHub 并分享下载链接
  • 我不知道在 GitHub 上上传项目的步骤。我试过但必须学习。请给我你的邮件ID,我会发送zip文件。谢谢'
【解决方案3】:

我为您的问题编写了简单的代码。这不好,但你可以参考这个想法来解决你的问题。

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    var activeField: UITextField?

    @IBOutlet weak var loginFieldsView: UIView!

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var mobileNo: UITextField!
    @IBOutlet weak var textFieldPassword: UITextField!
    var originalHeight:CGFloat!

    override func viewDidLoad() {
        super.viewDidLoad()

        mobileNo.delegate = self
        textFieldPassword.delegate = self
        originalHeight = self.loginFieldsView.frame.origin.y

        registerForKeyboardNotifications()
    }

    @IBAction func btnLoginAction(_ sender: Any) {

    }

    deinit {

        //NotificationCenter.default.removeObserver(self)
        self.deregisterFromKeyboardNotifications()
    }


    func registerForKeyboardNotifications() {

        //Adding notifies on keyboard appearing
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    func deregisterFromKeyboardNotifications() {

        //Removing notifies on keyboard appearing
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    func keyboardWasShown(notification: NSNotification) {

        //Need to calculate keyboard exact size due to Apple suggestions
        var info = notification.userInfo!
        let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
        if self.activeField != nil {
            if self.loginFieldsView.frame.origin.y == originalHeight {
                self.loginFieldsView.frame.origin.y -= (keyboardSize?.height)!
            }
        }
    }

    func keyboardWillBeHidden(notification: NSNotification) {

        //Once keyboard disappears, restore original positions
        var info = notification.userInfo!
        let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
        if originalHeight > self.loginFieldsView.frame.origin.y {
            self.loginFieldsView.frame.origin.y += (keyboardSize?.height)!
        }
        self.loginFieldsView.endEditing(true)
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
        self.activeField = textField
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        self.activeField = nil

    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        activeField?.resignFirstResponder()
        return true
    }
}

【讨论】:

  • @kishor0011 我刚刚编辑了我的答案。请检查一下。
  • 我试过但没有解决我的问题。在这个视图中移出 viewController。谢谢
  • 请替换为我发布的最新代码。我测试过,效果很好。
  • 我认为现在的问题和我在问题中提到的一样
  • 在点击文本字段时检查,同时在点击第二个文本字段时检查。谢谢
【解决方案4】:

只需一次更改,将您的视图旧框架保存在一个变量中,并在键盘消失时再次将其分配给您的视图。

import UIKit
    class CheckFontIconView: UIViewController,UITextFieldDelegate {

var activeField: UITextField?

@IBOutlet weak var loginFieldsView: UIView!

@IBOutlet weak var label: UILabel!
@IBOutlet weak var mobileNo: UITextField!
@IBOutlet weak var textFieldPassword: UITextField!
var previousFrame : CGRect!
override func viewDidLoad() {
    super.viewDidLoad()

    previousFrame=self.loginFieldsView.frame

    mobileNo.delegate = self
    textFieldPassword.delegate = self

    registerForKeyboardNotifications()
}

func keyboardWasShown(notification: NSNotification) {

    //Need to calculate keyboard exact size due to Apple suggestions
    var info = notification.userInfo!
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    if self.activeField != nil {
        self.loginFieldsView.frame.origin.y = previousFrame.origin.y-(keyboardSize?.height)!
    }
}

func keyboardWillBeHidden(notification: NSNotification) {

    //Once keyboard disappears, restore original positions
    /*var info = notification.userInfo!
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size*/
    self.loginFieldsView.frame = previousFrame
    //self.loginFieldsView.endEditing(true)
}

func textFieldDidBeginEditing(_ textField: UITextField) {
    self.activeField = textField
}

func textFieldDidEndEditing(_ textField: UITextField) {
    self.activeField = nil

}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    activeField?.resignFirstResponder()
    return true
}
}

【讨论】:

  • 好的,我会检查它,并会告诉你。谢谢
  • 请检查问题当 self.loginFieldsView 向上移动时,只需点击两个 textFields。你会知道的问题。
  • @kishor0011 你能显示你的视图截图,以便我更好地了解视图如何向上移动吗?
  • 请从keyboardWillBeHidden中删除self.loginFieldsView.endEditing(true),因为keyboardWillBeHidden在编辑结束时调用。
猜你喜欢
  • 2015-09-23
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 2018-01-12
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
相关资源
最近更新 更多