Swift Scrollview滚动,使出现键盘时按钮位于键盘上方

时间:2019-12-19 00:33:02

标签: swift scrollview

我实际上已经尝试了Internet上的每个解决方案来获得此答案,但是没有一个没有bug,它们都不起作用。我在滚动视图中嵌入了一个stackview,并且我希望signInButton位于键盘上方。

这是我当前尝试的解决方案:

@objc func keyboardWillShow(notification: NSNotification) {
    guard let userInfo: NSDictionary = notification.userInfo as NSDictionary?,
        let keyboardInfo = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
            return
    }
    let keyboardSize = keyboardInfo.cgRectValue.size
    scrollView.isScrollEnabled = false
    let contentInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)
    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets
    var rect = self.view.frame
    rect.size.height -= keyboardSize.height
    var frame = self.signInButton.frame
    frame.size.height += 50
    self.scrollView.scrollRectToVisible(frame, animated: true)
}
@objc func keyboardWillHide(notification: NSNotification) {
    let contentInset:UIEdgeInsets = UIEdgeInsets.zero
    scrollView.contentInset = contentInset
    scrollView.isScrollEnabled = false
}

但这并不能完全适用于所有屏幕尺寸。虽然该按钮始终出现,但有时它会出现在键盘上方,而其他时候则稍微高于键盘。而且,当键盘在某些屏幕上消失时,它也不起作用。我很好奇,是否有知识渊博的人能够给出一个有力的答案,而很多人都可以使用这个答案来解决这个普遍存在的问题。请雨燕5。

我知道我可以使用表格视图,但是令人难以置信的是,iOS没有清晰的替代性工作解决方案,而没有将所有内容都嵌入表格视图。

谢谢!

2 个答案:

答案 0 :(得分:0)

我也遇到过类似的问题,并通过使用此问题进行了修复。 (可能不是最好的方法,但它可以工作)

将它们添加到viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)  

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboarddismissedlogin(notification:)), name: Notification.Name("keyboarddismissedlogin"), object: nil)

定义这三个功能


// MARK: - KeyboardON
    @objc func keyboardWillShow(notification:NSNotification) {
           let userInfo:NSDictionary = notification.userInfo! as NSDictionary
           let keyboardFrame:NSValue = userInfo.value(forKey: UIResponder.keyboardFrameEndUserInfoKey) as! NSValue
           let keyboardRectangle = keyboardFrame.cgRectValue
           let keyboardHeight = keyboardRectangle.height
           TableBottomConstraint.constant = TableBottomConstraint.constant + keyboardHeight
           extraFunctions.keyboardHeight = Int(keyboardHeight)
       }
// MARK: - keyboardOFFheight
       @objc func keyboardWillHide(notification:NSNotification) {


           let userInfo:NSDictionary = notification.userInfo! as NSDictionary
           let keyboardFrame:NSValue = userInfo.value(forKey: UIResponder.keyboardFrameEndUserInfoKey) as! NSValue
           let keyboardRectangle = keyboardFrame.cgRectValue
           let keyboardHeight = keyboardRectangle.height

           if TableBottomConstraint.constant > keyboardHeight
           {
           TableBottomConstraint.constant = TableBottomConstraint.constant - keyboardHeight

           }

    }

// MARK: - Keyboard Dismiss
        @objc func keyboarddismissedlogin(notification: Notification) {

            TableBottomConstraint.constant = TableBottomConstraint.constant - CGFloat(extraFunctions.keyboardHeight)
        }

在这里,您必须出口表格或滚动视图的底部约束。

extraFunctions.keyboardHeight 

只是我创建的用于存储键盘高度的结构。 (您可以简单地创建一个变量而不是struct-> variable。我只是为了命名而这样做了)

这将仅在键盘出现时将视图从底部向上移,而在键盘消失时又变回原始位置。

假设您的按钮位于视图的底部,所有这些都可以正常工作。

答案 1 :(得分:0)

我不完全明白你的问题。就我而言,我将约束置于按钮的底部,并在键盘出现/消失时设置其常数。

@IBOutlet weak var edittingBottomConstraint: NSLayoutConstraint!

@objc func showKeyboard(notification: Notification) {
        if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
            let keyboardRectangle = keyboardFrame.cgRectValue
            let keyBoardHeight = keyboardRectangle.size.height
            edittingBottomConstraint.constant = -keyBoardHeight
        }
    }
相关问题