我实际上已经尝试了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没有清晰的替代性工作解决方案,而没有将所有内容都嵌入表格视图。
谢谢!
答案 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
}
}