Swift - 在用户输入时获取键盘输入
Swift - Get keyboard input as the user is typing
我在 swift 中有一个应用程序,其中 texfield 位于屏幕底部,当用户尝试键入任何内容时,键盘会覆盖文本字段,因此用户无法看到he/she 正在输入什么。为了解决这个问题,我想从用户那里获取键盘输入,每笔划/"type"(每次用户按下一个键),然后将其显示到位于键盘正上方的视图上。如果这是不可能的,或者非常复杂,我们非常欢迎您提出替代解决方案。
您需要注册为观察者才能收到通知,以查看键盘何时出现和消失。然后你会在显示时向上移动你的视图,或者在隐藏时将它恢复到原来的状态。
我的实现将整个视图向上移动了键盘高度,但如果您愿意,可以将 UITextField 向上移动。
你可以看看这个教程,或者看我在回答中的实现:
http://www.ioscreator.com/tutorials/move-view-behind-keyboard-ios8-swift
在viewDidAppear
中添加观察员
override func viewWillAppear(animated:Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}
然后您需要在 keyboardWillShow
和 keyboardWillHide
新方法中移动视图的方法。
@objc func keyboardWillShow(_ notification: NSNotification) {
let info = notification.userInfo!
let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
let keyboardHeight:CGFloat = keyboardSize.height
//let animationDuration:CGFloat = info[UIResponder.keyboardAnimationDurationUserInfoKey] as! CGFloat
UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseInOut, animations: {
self.view.transform = CGAffineTransform(translationX: 0, y: -keyboardHeight)
}, completion: nil)
}
并将视图移动到原始状态:
@objc func keyboardWillHide(_ notification: NSNotification) {
UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseInOut, animations: {
self.view.transform = CGAffineTransform.identity
}, completion: nil)
}
最后移除 viewDidDisappear
中的观察者
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
为了配合 Stefan Salatics 的回答,我使用了以下代码,因为键盘通常仍会覆盖文本字段。
-(void) keyboardWillShow:(NSNotification *)note
{
// Get the keyboard size
CGRect keyboardBounds;
[[note.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue: &keyboardBounds];
// Start animation
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.3f];
// Get Keyboard height and subtract the screen height by the origin of the textbox and height of text box to position textbox right above keyboard
self.scrollView.contentOffset = CGPointMake(0,keyboardBounds.size.height-([UIScreen mainScreen].bounds.size.height - commentBox.frame.origin.y - commentBox.frame.size.height));
[UIView commitAnimations];
}
虽然 Stefan 的答案更适合您当前的实施。你的问题是如何获取用户输入的每一个笔划。
为了完成
class viewController: UIViewController, UITextFieldDelegate{
var textField = UITextField()
override func viewDidLoad() {
textField.delegate = self
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
//string is used here as the value of the textField.
//This will be called after every user input in the textField
}
}
string
可以用来查看最新的用户输入是什么。您可以使用当前值存储局部变量,并将其与“新”值进行比较以查看已更改的内容。
以下是我对那个问题的处理方法。希望这个方法能解决你的问题。
这是您要使用的文本字段。
@IBOutlet var userID : UITextField!
你需要写这个函数。
func textFieldShouldReturn(textField: UITextField!)-> Bool
{ userID.resignFirstResponder( )
return true
}
在你想要的功能中,你需要写这个语法。
@IBAction func login(sender: AnyObject)
{
userID.resignFirstResponder( )
}
这是在 ViewDidLoad 或 ViewDidAppear 中
override func viewDidLoad( )
{
userID.delegate = self;
}
希望对你有用。
我在 swift 中有一个应用程序,其中 texfield 位于屏幕底部,当用户尝试键入任何内容时,键盘会覆盖文本字段,因此用户无法看到he/she 正在输入什么。为了解决这个问题,我想从用户那里获取键盘输入,每笔划/"type"(每次用户按下一个键),然后将其显示到位于键盘正上方的视图上。如果这是不可能的,或者非常复杂,我们非常欢迎您提出替代解决方案。
您需要注册为观察者才能收到通知,以查看键盘何时出现和消失。然后你会在显示时向上移动你的视图,或者在隐藏时将它恢复到原来的状态。
我的实现将整个视图向上移动了键盘高度,但如果您愿意,可以将 UITextField 向上移动。
你可以看看这个教程,或者看我在回答中的实现:
http://www.ioscreator.com/tutorials/move-view-behind-keyboard-ios8-swift
在viewDidAppear
override func viewWillAppear(animated:Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}
然后您需要在 keyboardWillShow
和 keyboardWillHide
新方法中移动视图的方法。
@objc func keyboardWillShow(_ notification: NSNotification) {
let info = notification.userInfo!
let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
let keyboardHeight:CGFloat = keyboardSize.height
//let animationDuration:CGFloat = info[UIResponder.keyboardAnimationDurationUserInfoKey] as! CGFloat
UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseInOut, animations: {
self.view.transform = CGAffineTransform(translationX: 0, y: -keyboardHeight)
}, completion: nil)
}
并将视图移动到原始状态:
@objc func keyboardWillHide(_ notification: NSNotification) {
UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseInOut, animations: {
self.view.transform = CGAffineTransform.identity
}, completion: nil)
}
最后移除 viewDidDisappear
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
为了配合 Stefan Salatics 的回答,我使用了以下代码,因为键盘通常仍会覆盖文本字段。
-(void) keyboardWillShow:(NSNotification *)note
{
// Get the keyboard size
CGRect keyboardBounds;
[[note.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue: &keyboardBounds];
// Start animation
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.3f];
// Get Keyboard height and subtract the screen height by the origin of the textbox and height of text box to position textbox right above keyboard
self.scrollView.contentOffset = CGPointMake(0,keyboardBounds.size.height-([UIScreen mainScreen].bounds.size.height - commentBox.frame.origin.y - commentBox.frame.size.height));
[UIView commitAnimations];
}
虽然 Stefan 的答案更适合您当前的实施。你的问题是如何获取用户输入的每一个笔划。
为了完成
class viewController: UIViewController, UITextFieldDelegate{
var textField = UITextField()
override func viewDidLoad() {
textField.delegate = self
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
//string is used here as the value of the textField.
//This will be called after every user input in the textField
}
}
string
可以用来查看最新的用户输入是什么。您可以使用当前值存储局部变量,并将其与“新”值进行比较以查看已更改的内容。
以下是我对那个问题的处理方法。希望这个方法能解决你的问题。
这是您要使用的文本字段。
@IBOutlet var userID : UITextField!
你需要写这个函数。
func textFieldShouldReturn(textField: UITextField!)-> Bool
{ userID.resignFirstResponder( )
return true
}
在你想要的功能中,你需要写这个语法。
@IBAction func login(sender: AnyObject)
{
userID.resignFirstResponder( )
}
这是在 ViewDidLoad 或 ViewDidAppear 中
override func viewDidLoad( )
{
userID.delegate = self;
}
希望对你有用。