我正在开发一个聊天应用。当键盘出现时,我必须移动文本字段。我用下面的代码来做这件事:
func keyboardWillShow(notification: NSNotification) {
if let userInfo = notification.userInfo {
if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
kbHeight = keyboardSize.height
self.animateTextField(true)
}
}
}
func keyboardWillHide(notification: NSNotification) {
self.animateTextField(false)
}
func animateTextField(up: Bool) {
var movement = (up ? -kbHeight : kbHeight)
UIView.animateWithDuration(0.3, animations: {
self.view.frame = CGRectOffset(self.view.frame, 0, movement)
})
}
但是当我使用这个代码时,第一条消息不显示。我想我必须调整tableview的大小。
以下是屏幕截图之前和之后键盘出现:
我使用自动布局。
如何解决这个问题?
5条答案
按热度按时间os8fio9y1#
2023更新
正确使用约束...
只有一种方法可以正确处理iOS中的这种混乱。
1.将下面的
KUIViewController
粘贴到您的项目中,1.创建一个非常简单的约束,即“内容的底部”。
1.将该约束拖到
bottomConstraintForKeyboard
KUIViewController将自动和正确地调整您的内容视图在任何时候。
所有的一切都是自动的。
所有Apple行为都是以标准方式正确处理的,例如按下按钮等。
你已经100%完成了。
那么“你应该调整哪个视图的大小?“
您不能使用
.view
...因为...你不能在iOS中调整
.view
的大小!!!只需创建一个名为“保持器”的UIView。它位于
.view
内部。保持器当然会有四个简单的约束top/bottom/left/right到
.view
。对“保持器”的底部约束实际上是
bottomConstraintForKeyboard
。给客人寄账单然后去喝酒。
没什么可做的了
很简单
在任何可能出现键盘的位置使用KUIViewController。
在那些屏幕上,关于键盘,所有的东西现在都是完全自动的。
你完了
呼。
clearKeyboard()
,只需添加一个短延迟,就完成了。(来自用户@wildcat12 https://stackoverflow.com/a/57698468/294884的一个很好的提示)
kse8i1jr2#
可以创建表视图底部自动布局约束的出口。
然后简单地使用这个代码:
如果创建底部约束时遇到问题:
在故事板中
|-[]-|
。现在你可以把它拖到你的视图控制器中,并把它添加为一个插座。
另一种解决方案是设置
tableView.contentInset.bottom
。但我以前没这么做过。如果你愿意,我可以试着解释。使用inset:
您可以尝试使用此代码设置插入。我自己还没有试过,但应该是这样的。
编辑:根据nacho 4d的建议更改了持续时间
1cklez4t3#
来自@胖子的留言:
一个细节-(不幸的是)点击你的内容也会解雇键盘。(他们都得到了事件。)然而,这几乎总是正确的行为;给予看.没有合理的是要避免这一点,所以忘记它,去与苹果流。
可以通过实现以下UIGestureRecognizerDelegate的方法来解决:
这样,如果用户触摸任何
UIControl
(UIButton、xmlextField等),手势识别器将不会调用clearKeyboard()
方法。要使其工作,请记住在类定义中或使用扩展来子类化UIGestureRecognizerDelegate。然后,在viewDidLoad()中,您应该将手势识别器委托分配为self。
准备复制和粘贴代码:
jyztefdp4#
也许它会帮助某人。您可以实现所需的行为而无需使用接口构建器
首先,您需要创建一个约束,并计算安全区域插入,以支持无按钮设备正确
然后在代码中初始化它
将其附加到视图并激活
最后
另外,如果视图是可滚动的,并且您希望使用键盘将其向上移动,并在键盘隐藏时返回到初始位置,则可以更改视图的contentOffset
用于向上滚动,以及
把它移下来
bbmckpt75#
如果您不想亲自处理这个问题,您可能会发现TPKeyboardAvoiding框架很有用。
只需遵循“安装说明”即可。将适当的.h/.m文件拖放到你的项目中,然后使你的ScrollView / TableView成为一个子类,如下所示: