iOS swift4,单击多个UITextFields,;键盘显示时,向上移动的UIButton不知道为什么向下移动

iOS swift4,单击多个UITextFields,;键盘显示时,向上移动的UIButton不知道为什么向下移动,ios,swift,Ios,Swift,多个UITextField,软键盘显示,单击一个UITextField时,ui按钮向上移动 单击空白区域时键盘关闭 现在键盘显示,单击另一个UITextField,ui按钮向下移动,此时键盘仍显示,我不想让ui按钮向下移动 为什么当键盘显示时,ui按钮向下移动 Gif屏幕截图 单击1:键盘显示 单击2:键盘隐藏 单击3:键盘显示 单击4:键盘显示,但我不希望ui按钮下移 继续单击3和4,ui按钮仍在下方 双击UITextField,则ui按钮将从新窗口向上移动 下面是代码 class Lo

多个
UITextField
,软键盘显示,单击一个
UITextField
时,
ui按钮向上移动

单击空白区域时键盘关闭

现在键盘显示,单击另一个
UITextField
ui按钮
向下移动,此时键盘仍显示,我不想让
ui按钮
向下移动

为什么当键盘显示时,
ui按钮
向下移动

Gif屏幕截图

  • 单击1:键盘显示
  • 单击2:键盘隐藏
  • 单击3:键盘显示
  • 单击4:键盘显示,但我不希望
    ui按钮下移
  • 继续单击3和4,
    ui按钮仍在下方
  • 双击
    UITextField
    ,则
    ui按钮将从新窗口向上移动

下面是代码

class LoginPasswordViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var phoneInput: UITextField! // this is the first UITextField
    @IBOutlet weak var passwordInput: UITextField! // this is the second UITextField
    @IBOutlet weak var btnOK: UIButton! // this is the UIButton, it move up when Soft keyboard show.
    fileprivate var btnOKOriginY: CGFloat!
    fileprivate var isShow: Bool?

    override func viewDidLoad() {
        super.viewDidLoad()
        // observer keyboard show
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(keyboardWillShow),
            name: NSNotification.Name.UIKeyboardWillShow,
            object: nil)

        // observer keyboard hide
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(keyboardWillHide),
            name: NSNotification.Name.UIKeyboardWillHide,
            object: nil)
    }

    @objc func keyboardWillHide(_ notification: Notification) {
        btnOK.frame.origin.y = btnOKOriginY
        isShow = false
    }

    @objc func keyboardWillShow(_ notification: Notification) {

        if let keyboardFrame: NSValue = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue {
            print("btnOK.frame.origin.y = ", btnOK.frame.origin.y)

            if  isShow ?? false && btnOK.frame.origin.y != btnOKOriginY{
                return
            }
            isShow = true
            if btnOKOriginY == nil {
                btnOKOriginY = btnOK.frame.origin.y
            }

            let keyboardRectangle = keyboardFrame.cgRectValue
            let keyboardHeight = keyboardRectangle.height
            btnOK.frame.origin.y = btnOKOriginY - keyboardHeight
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        closeSoftKey()
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        closeSoftKey()
        return true
    }

    func closeSoftKey() {
        phoneInput.resignFirstResponder()
        passwordInput.resignFirstResponder()
    }

}
类登录PasswordViewController:UIViewController,UIExtFieldDelegate{
@IBOutlet弱var phoneInput:UITextField!//这是第一个UITextField
@IBOutlet弱var密码输入:UITextField!//这是第二个UITextField
@IBOutlet弱var btnOK:UIButton!//这是UIButton,当软键盘显示时,它会向上移动。
fileprivate var btnOKOriginY:CGFloat!
fileprivate var isShow:Bool?
重写func viewDidLoad(){
super.viewDidLoad()
//观察家键盘秀
NotificationCenter.default.addObserver(
自己
选择器:#选择器(键盘将显示),
名称:NSNotification.name.UIKeyboardWillShow,
对象:无)
//观察者键盘隐藏
NotificationCenter.default.addObserver(
自己
选择器:#选择器(键盘将隐藏),
名称:NSNotification.name.UIKeyboardWillHide,
对象:无)
}
@objc func键盘将隐藏(uu通知:通知){
btnOK.frame.origin.y=btnOKOriginY
isShow=false
}
@objc func键盘将显示(uu通知:通知){
如果让keyboardFrame:NSValue=notification.userInfo?[UIKeyboardFrameEndUserInfoKey]作为?NSValue{
打印(“btnOK.frame.origin.y=,btnOK.frame.origin.y”)
如果是show??false&&btnOK.frame.origin.y!=btnOKOriginY{
返回
}
isShow=true
如果btnOKOriginY==nil{
btnOKOriginY=btnOK.frame.origin.y
}
设keyboardRectangle=keyboardFrame.cgRectValue
让keyboardHeight=keyboardRectangle.height
btnOK.frame.origin.y=btnOKOriginY-键盘高度
}
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
//处置所有可以重新创建的资源。
}
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
关闭软键()
}
func textField应该返回(textField:UITextField)->Bool{
关闭软键()
返回真值
}
func关闭软键(){
phoneInput.resignFirstResponder()辞职
passwordInput.resignFirstResponder()辞职
}
}

ui按钮的初始化通过
swift
code,问题不再

下面是代码,其他不变

var btnOK: UIButton!

func initUIButton() {

    btnOK = UIButton(frame: CGRect(x: self.view.frame.width - 55 - 16,
                                   y: self.view.frame.height - 55 - 32,
                                   width: 55,
                                   height: 55))
    btnOK.setImage( imageLiteral(resourceName: "ic_next"), for: .normal)
    self.view.addSubview(btnOK)
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    initUIButton()
}

这看起来不对,如果是这样的话??false&&btnOK.frame.origin.y!=我想它应该是不=<代码>btnOK.frame.origin.y!=btnOKOriginY
表示如果现在是
y
==btnOKOrignY,我需要向上移动
btnOK
。switch UITextField not call
键盘将隐藏
方法。但是
btnOK
已经下移了