我正在使用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")
}
}
现有答案有一些改进。
首先, UIKeyboardWillChangeFrameNotification
可能是最好的通知,因为它处理的不仅是显示/隐藏,还包括由于键盘更改(语言,使用第三方键盘等)和旋转引起的更改(但下面的注释说明指示键盘应隐藏)也可以处理以支持硬件键盘连接)。
其次,可以从通知中提取动画参数,以确保动画正确地在一起。
可能还有一些方法可以清理此代码,特别是如果您习惯于强制展开字典代码的话。
迅捷3
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()
// Note that SO highlighting makes the new selector syntax (#selector()) look
// like a comment but it isn't one
NotificationCenter.default.addObserver(self,
selector: #selector(self.keyboardNotification(notification:)),
name: NSNotification.Name.UIKeyboardWillChangeFrame,
object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
@objc func keyboardNotification(notification: NSNotification) {
if let userInfo = notification.userInfo {
let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
let endFrameY = endFrame.origin.y ?? 0
let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue
let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(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)
}
}
(根据@Gabox的出色注释,编辑后考虑了键盘动画在屏幕外而不是缩小)
斯威夫特5
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()
// Note that SO highlighting makes the new selector syntax (#selector()) look
// like a comment but it isn't one
NotificationCenter.default.addObserver(self,
selector: #selector(self.keyboardNotification(notification:)),
name: UIResponder.keyboardWillChangeFrameNotification,
object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
@objc func keyboardNotification(notification: NSNotification) {
if let userInfo = notification.userInfo {
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编程,我正在使用此代码移动,但它不起作用。我正确地调用函数,但文本字段不移动。我正在使用自动布局。
我的视图中有六个UITextFields,我想决定视图是否必须移动。在移动视图之前,如何检查选择了哪个文本字段? 这是我显示键盘和移动视图的代码:
我有一个自定义背景编辑文本。当他们的键盘打开-屏幕调整显示集中编辑文本,问题是,它削减了我的自定义背景。 什么是最好的方式显示我的编辑文本包括他的敲击白背景时,键盘打开? 我的清单现在是调整设置。
问题内容: 我在Objective-C方面经验不足。我想使用Swift编程语言隐藏文本字段的键盘。 我也尝试过 但是当我按下return时,该方法没有被触发。有人有运气吗? 问题答案: 我认为问题出在设置代表。 请像这样将文本字段委托设置为您的ViewController 然后像这样为您的文本字段创建IBOutlet 确保它已连接到情节提要中视图上的文本字段。 最后使用 我们快完成了。现在,将此委
问题内容: 请向我解释有关软键盘的问题。例如,我的活动,对话框片段或片段活动(无论如何)上都有一个EditText。这里是: 当它第一次显示时,我没有看到软键盘,必须按下editText才能获得焦点,然后出现键盘。另一个活动有所不同,当它出现在屏幕上时,将在没有任何帮助的情况下加载键盘。我认为 表示EditText将被聚焦并且键盘将出现,但是我错了。 我应该如何管理哪个组件将获得焦点,键盘将 自动
如何强制GLFW管理每秒60次以上的键盘回调?也就是说,我希望GLFW的键盘处理速度取决于实际的FPS。这可能吗?