当键盘出现时,我的UIView无法正常移动。 UIView中有一个用于输入文本的UITextView。如果我选择TextView输入文本,键盘会出现,但UIView不会移动第一次。如果我点击背景并使键盘消失然后再次点击TextView,则UIView会正确向上移动。有谁知道这里发生了什么?
class ChatViewController: UIViewController, CNContactPickerDelegate, UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource, UIToolbarDelegate, UITextFieldDelegate, UITextViewDelegate {
@IBOutlet weak var composeTextView: UITextView!
@IBOutlet weak var composeViewBottomConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
composeTextView.delegate = self
}
func textViewDidBeginEditing(_ textView: UITextView) {
UIView.animate(withDuration: 0.5){
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
}
self.view.layoutIfNeeded()
}
@objc func keyboardWillShow(notification: Notification) {
let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
let keyboardHeight = keyboardSize?.height
if #available(iOS 11.0, *){
self.composeViewBottomConstraint.constant = keyboardHeight! - view.safeAreaInsets.bottom
}
else {
self.composeViewBottomConstraint.constant = view.safeAreaInsets.bottom
}
self.view.layoutIfNeeded()
}
}
答案 0 :(得分:4)
问题是第一次单击textView时视图没有上升,showKeyboard观察者是在beginEditing中添加的,所以这一行应该在viewDidLoad
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: .UIKeyboardWillHide, object: nil)
除了以下修复
func textViewDidBeginEditing(_ textView: UITextView) {
// I think no need for it
}
@objc func keyboardWillShow(notification: Notification) {
let keyboardSize = (notification.userInfo? [UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
let keyboardHeight = keyboardSize?.height
if #available(iOS 11.0, *){
self.composeViewBottomConstraint.constant = keyboardHeight! - view.safeAreaInsets.bottom
}
else {
self.composeViewBottomConstraint.constant = view.safeAreaInsets.bottom
}
UIView.animate(withDuration: 0.5){
self.view.layoutIfNeeded()
}
}
@objc func keyboardWillHide(notification: Notification){
self.composeViewBottomConstraint.constant = 0 // or change according to your logic
UIView.animate(withDuration: 0.5){
self.view.layoutIfNeeded()
}
}
答案 1 :(得分:0)
试试这个
let KEYBOARDAPPEAR = 226
func textViewDidBeginEditing(_ textView: UITextView) {
animateViewMoving(up: true, moveValue: CGFloat(KEYBOARDAPPEAR), view: self.view)
}
func textViewDidEndEditing(_ textView: UITextView) {
animateViewMoving(up: false, moveValue: CGFloat(KEYBOARDAPPEAR), view: self.view)
}
func animateViewMoving (up:Bool, moveValue :CGFloat, view:UIView){
let movementDistance:CGFloat = -moveValue
let movementDuration: Double = 0.3
var movement:CGFloat = 0
if up{
movement = movementDistance
}else{
movement = -movementDistance
}
UIView.beginAnimations("animateTextField", context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(movementDuration)
view.frame = view.frame.offsetBy(dx: 0, dy: movement)
UIView.commitAnimations()
}