避免视图的Swift键盘无法正常工作

时间:2018-03-13 07:16:57

标签: ios swift

enter image description here

在上面的GIF中,=B4应该是键盘避开视图。它永远不会被键盘覆盖。当开始编辑其中任何一个文本字段时,loginMenu确实会被推送到#34;但是,在编辑时,loginMenu会返回其原始位置。这有什么不对?这是我的代码:

loginMenu

3 个答案:

答案 0 :(得分:1)

不要使用键盘会改变(当选择听写时你也会得到不正确的行为)。而是使用willShow然后将消失以移动您的视图/字段。

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

我还在UITextInputCurrentInputModeDidChange上放置了一个观察者来解决听写和谷歌键盘等问题。

另一种方法是使用IQKeyboardManagerSwift,除非您有充分的理由订购自定义版本。

答案 1 :(得分:1)

您可以使用do.call(rbind, lapply(1:length(kmean), function(x) kmean[[x]]$cluster)) 删除此问题,

为例子

self.view.layoutIfNeeded()

heare work of self.view.layoutIfNeeded(): -

基本上调用self.view.layoutIfNeeded()会强制self.view及其子视图的布局,如果有些更改为self.view设置setNeedsLayout。

setNeedsLayout用于设置一个标志,每当调用layoutIfNeeded()时,都会调用layoutSubviews。这是决定"如果需要"电话的方面。

如果你对UIView进行了更改,导致它设置为setNeedsLayout但是没有调用layoutIfNeeded()(因此不调用layoutSubviews),它将不会更新,因此可能会导致动画出现问题。如果您事先调用它,它将确保如果有更改需要更新布局,那么它将在动画制作之前将其应用于您的视图及其所有子视图。

当然,动画制作动画时需要更新。

答案 2 :(得分:1)

以下是解决方案,创建loginMenu视图

的底部布局约束参考
@IBOutlet weak var bottomConstraint: NSLayoutConstraint!
@IBOutlet weak var loginMenu: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardNotification), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardNotification), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    override func viewWillDisappear(_ animated: Bool) {
        NotificationCenter.default.removeObserver(self)
    }

    @objc func handleKeyboardNotification(_ notification: Notification) {

    if let userInfo = notification.userInfo {

        let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue

        let isKeyboardShowing = notification.name == NSNotification.Name.UIKeyboardWillShow

        bottomConstraint?.constant = isKeyboardShowing ? -keyboardFrame!.height : 0

        UIView.animate(withDuration: 0.5, animations: { () -> Void in
            self.view.layoutIfNeeded()
        })
    }
}

Demo Example