我正在使用Swift进行iOS编程,我正在使用此代码移动UITextField
,但它不起作用。我正确地调用函数keyboardWillShow
,但文本字段不移动。我正在使用自动布局。
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self);
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
//let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
var frame = self.ChatField.frame
frame.origin.y = frame.origin.y - keyboardSize.height + 167
self.chatField.frame = frame
println("asdasd")
}
}
一个简单的解决方案是在键盘高度不变的情况下向上移动视图。
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}
@objc func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y = -150 // Move view 150 points upward
}
@objc func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y = 0 // Move view to original position
}
Swift 5:
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(sender:)), name: UIResponder.keyboardWillShowNotification, object: nil);
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(sender:)), name: UIResponder.keyboardWillHideNotification, object: nil);
如果您使用的是自动布局,我假设您已经将底部空间设置为Superview约束。如果是这种情况,只需更新约束的值即可。下面是你如何通过一点动画来做到这一点。
func keyboardWasShown(notification: NSNotification) {
let info = notification.userInfo!
let keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
UIView.animateWithDuration(0.1, animations: { () -> Void in
self.bottomConstraint.constant = keyboardFrame.size.height + 20
})
}
添加硬编码的20只是为了稍微弹出键盘上方的文本字段。否则,键盘的上边距和textfield的下边距会相互接触。
解除键盘后,将约束的值重置为其原始值。
在现有答案的基础上,还需要做一些改进。
首先,UIKeyboardWillChangeFrameNotification可能是最好的通知,因为它处理的更改不仅仅是显示/隐藏,还包括键盘更改(语言、使用第三方键盘等)和旋转引起的更改(但请注意,下面指示键盘将隐藏的注释也应进行处理,以支持硬件键盘连接)。
其次,可以从通知中提取动画参数,以确保动画正确地在一起。
可能有一些选项可以更彻底地清理这段代码,尤其是如果您对强制展开字典代码感到满意的话。
class MyViewController: UIViewController {
// This constraint ties an element at zero points from the bottom layout guide
@IBOutlet var keyboardHeightLayoutConstraint: NSLayoutConstraint?
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self,
selector: #selector(self.keyboardNotification(notification:)),
name: UIResponder.keyboardWillChangeFrameNotification,
object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
@objc func keyboardNotification(notification: NSNotification) {
guard let userInfo = notification.userInfo else { return }
let endFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
let endFrameY = endFrame?.origin.y ?? 0
let duration:TimeInterval = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
let animationCurveRawNSN = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)
if endFrameY >= UIScreen.main.bounds.size.height {
self.keyboardHeightLayoutConstraint?.constant = 0.0
} else {
self.keyboardHeightLayoutConstraint?.constant = endFrame?.size.height ?? 0.0
}
UIView.animate(
withDuration: duration,
delay: TimeInterval(0),
options: animationCurve,
animations: { self.view.layoutIfNeeded() },
completion: nil)
}
}
问题内容: 我正在使用Swift在iOS上进行编程,并且正在使用此代码移动,但是它不起作用。我正确调用了该函数,但是文本字段没有移动。我正在使用自动版式。 问题答案: 现有答案有一些改进。 首先, UIKeyboardWillChangeFrameNotification 可能是最好的通知,因为它处理的不仅是显示/隐藏,还包括由于键盘更改(语言,使用第三方键盘等)和旋转引起的更改(但下面的注释说明
我有一个自定义背景编辑文本。当他们的键盘打开-屏幕调整显示集中编辑文本,问题是,它削减了我的自定义背景。 什么是最好的方式显示我的编辑文本包括他的敲击白背景时,键盘打开? 我的清单现在是调整设置。
问题内容: 请向我解释有关软键盘的问题。例如,我的活动,对话框片段或片段活动(无论如何)上都有一个EditText。这里是: 当它第一次显示时,我没有看到软键盘,必须按下editText才能获得焦点,然后出现键盘。另一个活动有所不同,当它出现在屏幕上时,将在没有任何帮助的情况下加载键盘。我认为 表示EditText将被聚焦并且键盘将出现,但是我错了。 我应该如何管理哪个组件将获得焦点,键盘将 自动
问题内容: 我有一段可以在Swift 2中使用的代码,我尝试使用Xcode将代码更新为最新版本,并修复了除两个问题以外的所有内容。 我有这个代码: 与此配对: 在第一部分,我现在得到一个错误提示 类型“ LoginViewController”没有成员“ keyboardWillShow / Hide” 我不明白为什么它没有看到下面的方法。 有人知道这个问题的解决方案吗? 问题答案: 查阅更新的《
我已经在NSNotificationCenter中注册了两个观察员,keyboardWillShow:和keyboardWillHide: 在这两种方法中,当我尝试设置包含UITextView的UIView的动画时,它会跳到我尝试设置动画的帧,然后再设置回原始位置的动画。我在touchesbearth方法中尝试了相同的动画代码来测试它,它在那里工作得很好(设置新帧的动画,而不是跳回原始位置)。 我
问题内容: 我有一个应用程序,该应用程序在视图的下半部分具有文本字段。这意味着当我输入文本字段时,键盘将覆盖文本字段。 如何在键入时向上移动视图,以便可以看到正在键入的内容,然后在键盘消失时将其向下移动到原始位置? 我到处都看过,但是所有解决方案似乎都在Obj-C中,我还不能完全转换。 任何帮助将不胜感激。 问题答案: 这是一个解决方案,无需处理从一个textField到另一个的切换: 要解决此问