我从this existing question学习,让func“keyboardwillshow”在整个视图中向上移动相同的键盘高度,以避免键盘覆盖底部的文本区/文本视图。
但是,如果我连续点击两个或多个文本字段,“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)
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
self.view.frame.origin.y -= keyboardSize.height
}
}
func keyboardWillHide(notification: NSNotification) {
self.view.frame.origin.y = 0
}
有人在答案中说我们可以实现一个布尔值来检测键盘是否已经出现,所以func只能工作一次。
有人可以告诉我如何做这个布尔值吗?谢谢!
答案 0 :(得分:0)
首先添加一个实例变量来存储布尔值并初始化为false(var keyboardIsShown = false
。接下来在keyboardWillShow
的if语句中,将之前创建的boolean
设置为true
现在已经显示了键盘。下一步是在移动视图之前在keyboardWillShow
内添加另一个if语句,以检查键盘是否已经显示。最后确保设置{{1}再次隐藏键盘时返回boolean
。
false
答案 1 :(得分:0)
确定。我发现更好的解决方案是使用UITextFieldTextDidBeginEditingNotification和UITextViewTextDidBeginEditingNotification,或UITextViewTextDidBeginEditingNotification和UITextViewTextDidEndEditingNotification。
示例:
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name: UITextFieldTextDidBeginEditingNotification, object: yourTextField)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name: UITextFieldTextDidEndEditingNotification, object: yourTextView)
这样,键盘行为仅适用于标识为object:的指定textfield或textview。如果您希望此功能适用于View中的所有文本字段或文本视图,则对象为零。