ios - 在 UITextField 中输入内容后 UIView 消失?

标签 ios swift keyboard

我正在尝试将 UIView 绑定(bind)到键盘,它工作正常,但是当我在一个 UITextField 中键入内容时,UIView 会转到底部并消失,当键盘隐藏时甚至不可见。

这是我的绑定(bind)键盘功能:

func bindToKeyboard() {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
}

@objc func keyboardWillChange(notification: NSNotification) {
    let duration = notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as! Double
    let curve = notification.userInfo![UIResponder.keyboardAnimationCurveUserInfoKey] as! UInt
    let startingFrame = (notification.userInfo![UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    let endingFrame = (notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
    let deltaY = endingFrame.origin.y - startingFrame.origin.y

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

viewDidLoad() 中的用法:

nextBackView.bindToKeyboard()

编辑查看某人的答案: enter image description here

最佳答案

您应该使用UIScrollView,而不是UIView。一个scrollView将有一个contentView,它只不过是一个UIView。 向此 UIView(我宁愿说是 contentView)添加文本字段。

这就是带有约束的 Storyboard 中的样子。

enter image description here

UIScrollView 顶部和底部空间与顶部和底部布局指南对齐。其余的约束很简单。

在下面的代码中,我们检查键盘是否已经打开。如果边缘插入为零,即底部内容插入为零,则意味着键盘将打开。在这里,我们确保底部的插入现在将更改为例如 280.0,即内容 View 被推向顶部边缘 280 点。

当键盘关闭时,我们将 contentInset.bottom 移回到内容 View 底部的 0 点,

func bindToKeyboard() {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
}

//Set default to zero, when keyboard opens it changes to a non zero value. When keyboard closes it is set back to the correct value.
var scrollContentInset = UIEdgeInsets.zero

@objc func keyboardWillChange(notification: NSNotification) {
    let duration = notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as! Double
    let curve = notification.userInfo![UIResponder.keyboardAnimationCurveUserInfoKey] as! UInt
    let endingFrame = (notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue


    UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIView.KeyframeAnimationOptions(rawValue: curve), animations: {

        if self.scrollContentInset.bottom == 0 {
            let adjustmentHeight = (endingFrame.height + 20) * (1)
            self.scrollView.contentInset.bottom += adjustmentHeight
            self.scrollView.scrollIndicatorInsets.bottom += adjustmentHeight

        } else{
            let adjustmentHeight = (endingFrame.height + 20) * (-1)
            self.scrollView.contentInset.bottom += adjustmentHeight
            self.scrollView.scrollIndicatorInsets.bottom += adjustmentHeight
        }

        self.scrollContentInset = self.scrollView.contentInset


    }, completion: nil)
}


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

iOS keyboardWillChange: 被多次调用。所以这里键盘逻辑略有改变。在键盘打开之前,Y 是 UIScreen 的高度,当键盘打开时,Y 向其方向向上移动(左上角为 0,0)。这有助于检测键盘是否打开。

当键盘关闭时,有时由于软键盘(cmd + K)或按回车键,键盘的高度会有所不同。在 (cmd + K) 的情况下,结束帧的高度为 54 点,而起始帧的高度为 355.0。由于键盘打开高度为 355.0 ,因此它应该偏移相同的量。所以我在这里使用 startFrame 和 EndFrame 的最大高度。

如果键盘在软键盘模式下打开,startFrameendFrame的Y将相同,因此在这种情况下contentInset不会被修改。

我希望这有助于解决键盘问题。

@objc func keyboardWillChange(notification: NSNotification) {
    let duration = notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as! Double
    let curve = notification.userInfo![UIResponder.keyboardAnimationCurveUserInfoKey] as! UInt
    let startFrame = (notification.userInfo![UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    let endingFrame = (notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue



    UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIView.KeyframeAnimationOptions(rawValue: curve), animations: {

        if startFrame.minY > endingFrame.minY {
            /*
             *Keyboard opening
            */
            let adjustmentHeight = CGFloat.maximum(startFrame.height, endingFrame.height)
            self.scrollView.contentInset.bottom = adjustmentHeight
            self.scrollView.scrollIndicatorInsets.bottom = adjustmentHeight
        } else if startFrame.minY < endingFrame.minY{
            /*
             *Keyboard Closing
             */
            let adjustmentHeight =  CGFloat.maximum(endingFrame.height, startFrame.height) * (-1)
            self.scrollView.contentInset.bottom += adjustmentHeight
            self.scrollView.scrollIndicatorInsets.bottom += adjustmentHeight
        }



    }, completion: nil)
}

我在这里发现的另一件事是,在横向模式(landscapeRight)下,起始帧高度为 277.0,而结束帧高度为 209.0。当我们最小化键盘时,它是 209。当设备处于纵向模式,然后您以横向右侧模式打开键盘时,会发生这种情况。

所以你可能希望键盘打开时的调整高度为 endFrameheight

if startFrame.minY > endingFrame.minY {

    let adjustmentHeight =  endingFrame.height
.........
}

关于ios - 在 UITextField 中输入内容后 UIView 消失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55389121/

相关文章:

ios - 如何禁用屏幕特定区域的滑动球功能? ( swift )(SpriteKit)

java - Libgdx(输入)按键似乎跳过了一些东西

Android:如何防止软键盘将我的 View 向上推?

iphone - TapJoy 旋转我在游戏中使用的所有 UIViewContoller

ios - 在Fabric Crashlytics中获取probeGC崩溃

iphone - 具有自定义类型的 UIButton 似乎无法正常工作

ios - 保护对 NSManaged 对象数组的读/写访问

ios - 点击手势仅响应上次查看

ios - iOS如何在Shared/AppGroup/xxx/Library/Sounds中播放自定义通知声音文件

键盘shift键有问题