如何在滚动表格时将inputView移动到键盘上方
我有一个视图控制器,它在表格下面有表视图和textView
当我点击textView时,键盘出现,当我在textView外面点击键盘时,键盘会失效,但是我有一个问题就是当我拖动 (向下滚动)表格视图时,textView不会随着键盘向下移动我在键盘后面看到黑色背景,如下图所示
如何在Swift中解决这个问题
更新:这是我当前观察keyboardFrameChanges的代码
func keyboardFrameChanged(notification: NSNotification) { let dict = NSDictionary(dictionary: notification.userInfo!) let keyboardValue = dict.objectForKey(UIKeyboardFrameEndUserInfoKey) as! NSValue let bottomDistance = mainScreenSize().height - keyboardValue.CGRectValue().origin.y let duration = Double(dict.objectForKey(UIKeyboardAnimationDurationUserInfoKey) as! NSNumber) UIView.animateWithDuration(duration, animations: { self.inputViewConstraint!.constant = -bottomDistance self.view.layoutIfNeeded() }, completion: { (value: Bool) in self.chatTableView.scrollToBottom(animation: true) }) }
更新2:我通过将keyboardDismissMode从Interactive更改为OnDrag找到了解决方案
chatTableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag
一旦观察到表中的任何拖动动作,这将立即将键盘和textView向下移动,但是如何在交互模式下执行此操作,如在whatsapp聊天视图中
您可以使用NSNotificationCenter
观察键盘的框架,并创建一个在框架更改时调用的方法。 在此方法中,您可以获得键盘的坐标,并可以相应地重新定位inputView
。
override func viewDidLoad() { super.viewDidLoad() NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.keyboardDidChangeFrame(_:)), name: UIKeyboardWillChangeFrameNotification, object: nil) } func keyboardDidChangeFrame(notification: NSNotification) { let keyboardScreenFrameEnd = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() let keyboardViewFrameEnd = view.convertRect(keyboardScreenEndFrame, fromView: view.window) let keyboardHeight = keyboardViewFrameEnd.height // calculate the offset of your inputView inputView.frame = CGRectOffset(inputView?.frame, ..., ...) }
我通过将keyboardDismissMode从Interactive更改为OnDrag找到了解决方案
chatTableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag
一旦观察到表格中的任何拖动动作,这将立即将键盘和textView向下移动
找到答案永远都是这样,但这是在启用交互状态的情况下实现此function的正确方法。
在具有显示聊天气泡的tableview或集合视图的视图控制器中覆盖inputAccessoryView,然后返回包含uitextView或uitextField的视图。 并覆盖canBecomeFirstResponder然后返回true。
override var inputAccessoryView: UIView? { get { self.inputBar.frame.size.height = self.barHeight // 50.0 self.inputBar.clipsToBounds = true return self.inputBar } } override var canBecomeFirstResponder: Bool{ return true }