UIButton 与键盘一起移动。用户按键时位置重置

Posted

技术标签:

【中文标题】UIButton 与键盘一起移动。用户按键时位置重置【英文标题】:UIButton to move along with keyboard. The position resets when user presses a key 【发布时间】:2017-11-12 00:10:48 【问题描述】:

我有一个用键盘移动屏幕底部的 UIButton 的函数。问题是,当用户按下一个键(开始在文本字段中写入)时,按钮会返回向下。

我尝试设置addBtn.translatesAutoresizingMaskIntoConstraints = true

这仅在我的 Xcode 将 main.storyboard 设置为模拟器时才有效,否则它会破坏约束。起初我以为这只是 Xcode 9 的错误,但后来我在 iTunes Connect 上上传了一个捆绑包,并让我的女朋友通过 TestFlight 下载该应用程序,确实在设置 translatesAutoresizingMaskIntoConstraints = true 时限制被搞砸了

func bindToKeyboard () 
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame , object: nil)


@objc func keyboardWillChange(_ notification : NSNotification) 
    let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
    let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
    let startingFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    let endingFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

    let deltaY = endingFrame.origin.y - startingFrame.origin.y

    UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: self.frame.origin.y += deltaY
    ,completion: nil)

【问题讨论】:

尝试使用keyboardWillShow 和keyboardWillHide 而不是keyboardWillChange 通知。或者,查看使动画更易于管理以及键盘显示和消失的键盘附件视图。 当前的逻辑是keyboardWillChange,因为我有2个文本字段,一个数字和一个字母,所以键盘是不同的,它需要随着键盘的变化移动按钮。反正我试了你说的还是不行 【参考方案1】:

好的,在与这个错误斗争 3 小时后,我禁用了自动调整蒙版,并为 bottom constraint 创建了一个 outlet

在每个动画之后,我都用 deltaY 更新了该约束

所以我的代码现在看起来像这样

func bindToKeyboard () 
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame , object: nil)


@objc func keyboardWillChange(_ notification : NSNotification) 
    let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
    let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
    let startingFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    let endingFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

    let deltaY = endingFrame.origin.y - startingFrame.origin.y

    UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: self.frame.origin.y += deltaY
    ,completion: nil)


    btc.constant -= deltaY

多么愉快的星期六晚上啊!我喜欢编程!

【讨论】:

以上是关于UIButton 与键盘一起移动。用户按键时位置重置的主要内容,如果未能解决你的问题,请参考以下文章

在 UITextField 上点击时将 UIButton 移动到键盘上方

jQuery事件与动画

关闭键盘无法与 PickerView 一起使用

如何创建一个行为类似于 UIKeyboard(数字键盘)的 UIButton 矩阵?

将 PrimeFaces 与 JSF 一起使用时 Shiro 重定向到错误的位置

键盘出现时如何移动视图Y轴变化