gpt4 book ai didi

ios - 处理具有底部约束的键盘

转载 作者:搜寻专家 更新时间:2023-11-01 06:28:45 26 4
gpt4 key购买 nike

我正在构建一个具有常规设计和聊天应用 UI 的聊天应用。

我有一个我的应用程序需要的“工具栏”(0,0 375x66),我希望它在显示键盘时保持原样。它有 4 个约束:top: 0, leading: 0, trailing: 0, aspect-ratio: 125:22

我有一个 UICollectionView (0,66 375x530),我想在显示键盘时像任何其他聊天应用程序一样滚动它。它有 4 个约束:顶部(到工具栏):0,前导:0,尾随:0,底部(到 newMessageView,我将在稍后解释):0

我有一个 UIView,里面有一个 UITextField。我们称它为 newMessageView (0,596 375x71),它有 4 个约束:bottom: 0, leading: 0, trailing: 0, aspect-ratio: 375:71

现在,我正尝试在显示键盘时引入 newMessageView 应用程序。我正在尝试这样做:

@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
if self.view.frame.origin.y == 0{
self.newMessageViewBottomConstraint.constant += keyboardSize.height
}
}
}

@objc func keyboardWillHide(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
if self.view.frame.origin.y != 0{
self.newMessageViewBottomConstraint.constant -= keyboardSize.height
}
}
}

但它完全不起作用。 View 跳跃和隐藏,我真的不明白为什么。

我做的对吗?任何人都可以帮助我并指导我吗?

最佳答案

更新约束后必须使用self.view.layoutIfNeeded()

我为你写完整的解决方案

 class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

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

}

@objc func keyboardWillShow(notification: Notification) {
self.keyboardControl(notification, isShowing: true)
}

@objc func keyboardWillHide(notification: Notification) {
self.keyboardControl(notification, isShowing: false)
}


private func keyboardControl(_ notification: Notification, isShowing: Bool) {


/* Handle the Keyboard property of Default*/

var userInfo = notification.userInfo!
let keyboardRect = (userInfo[UIKeyboardFrameEndUserInfoKey]! as AnyObject).cgRectValue
let curve = (userInfo[UIKeyboardAnimationCurveUserInfoKey]! as AnyObject).uint32Value

let convertedFrame = self.view.convert(keyboardRect!, from: nil)
let heightOffset = self.view.bounds.size.height - convertedFrame.origin.y
let options = UIViewAnimationOptions(rawValue: UInt(curve!) << 16 | UIViewAnimationOptions.beginFromCurrentState.rawValue)
let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey]! as AnyObject).doubleValue



var pureheightOffset : CGFloat = -heightOffset

if isShowing { /// Wite space of save area in iphonex ios 11
if #available(iOS 11.0, *) {
pureheightOffset = pureheightOffset + view.safeAreaInsets.bottom
}
}

// Here change you Consrant
// self.actionBarPaddingBottomConstranit?.update(offset:pureheightOffset)

UIView.animate(
withDuration: duration!,
delay: 0,
options: options,
animations: {
self.view.layoutIfNeeded()
},
completion: { bool in

})

}

关于ios - 处理具有底部约束的键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50171955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com