[英]UITextView won't scroll when keyboard is displayed
我實現了一些代碼,以在顯示鍵盤時滾動屏幕,以防止覆蓋字段。
這對於Text字段工作正常,但是不適用於UITextView字段。
這是我實現的代碼:
func textFieldDidBeginEditing(textField: UITextField)
{
//print("textfieldDidBeginEditing")
activeField = textField
}
func textFieldDidEndEditing(textField: UITextField)
{
//print("textfieldDidEndEditing")
activeField = nil
}
func textViewDidBeginEditing(textView: UITextView) {
print("textViewDidBeginEditing")
//print(textView)
activeTextView = textView
print("1activeTextView:\(activeTextView)")
}
func textViewDidEndEditing(textView: UITextView) {
print("textViewDidEndEditing")
//print(textView)
//print("2activeTextView:\(activeTextView)")
activeTextView = nil
}
func registerForKeyboardNotifications()
{
//Adding notifies on keyboard appearing
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
}
func deregisterFromKeyboardNotifications()
{
//Removing notifies on keyboard appearing
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWasShown(notification: NSNotification)
{
print("yes")
//Need to calculate keyboard exact size due to Apple suggestions
self.scrollView.scrollEnabled = true
let info : NSDictionary = notification.userInfo!
let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size
let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0)
self.scrollView.contentInset = contentInsets
self.scrollView.scrollIndicatorInsets = contentInsets
var aRect : CGRect = self.view.frame
aRect.size.height = keyboardSize!.height
if (activeField != nil) {
print("KWSactivfield:\(activeField)")
if (!CGRectContainsPoint(aRect, activeField!.frame.origin))
{
print("!CGRectContainsPoint")
self.scrollView.scrollRectToVisible(activeField!.frame, animated: true)
}
}
if (activeTextView != nil) {
print("KWSactiveTextView:\(activeTextView)")
if (!CGRectContainsPoint(aRect, activeTextView!.frame.origin))
{
print("true4")
self.scrollView.scrollRectToVisible(activeTextView!.frame, animated: true)
}
}
}
func keyboardWillBeHidden(notification: NSNotification)
{
//Once keyboard disappears, restore original positions
let info : NSDictionary = notification.userInfo!
let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size
let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, -2*keyboardSize!.height, 0.0)
print("insets")
self.scrollView.contentInset = contentInsets
self.scrollView.scrollIndicatorInsets = contentInsets
self.view.endEditing(true)
self.scrollView.scrollEnabled = false
}
我注意到,一旦在keyboardWasShown函數中,activeTextView始終為“ nil”。
任何幫助將不勝感激,因為我似乎無法弄清楚。
謝謝!
我知道這是一篇舊文章,但是我遇到了同樣的問題,我用了一些小技巧解決了它。 我在這里發布了我的解決方案,該解決方案可能會對其他人有所幫助。
訣竅是為所有textview的tag屬性分配一個值,然后在我的keyboardWasShown方法中讀取它,並根據此值,我知道選擇了哪個textview。 一些代碼將幫助您了解我的所作所為:
我聲明了我的textviews和一個int變量來存儲所選textview的標記值:
var myTextViewField: UITextView! = nil
var anotherTextViewField: UITextView! = nil
var activeTextViewTag: Int = 0
在viewDidLoad與所有其他屬性,我已經設置了我的textviews的tag屬性:
myTextViewField.tag = 1
anotherTextViewField.tag = 2
現在是時候讀取標簽值了,我是在textViewDidBeginEditing方法中完成的
func textViewDidBeginEditing(_ textView: UITextView) {
activeTextViewTag = textView.tag
}
最后,在keyboardWasShown方法中讀取activeTextViewTag值並移動scrollview
func keyboardWasShown(notification: NSNotification){
print("keyboardWasShown")
if let userInfo = notification.userInfo {
if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
scrollView.contentInset = contentInsets;
scrollView.scrollIndicatorInsets = contentInsets;
// If active text field is hidden by keyboard, scroll it so it's visible
var aRect: CGRect = self.view.frame
aRect.size.height = aRect.size.height - keyboardSize.height
var activeField: UITextView! = nil
if(activeTextViewTag == 1){
activeField = myTextViewField
} else {
activeField = anotherTextViewField
}
if(!aRect.contains(activeField.frame.origin)){
self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
}
} else {
// no UIKeyboardFrameBeginUserInfoKey entry in userInfo
print("no UIKeyboardFrameBeginUserInfoKey entry in userInfo")
}
} else {
// no userInfo dictionary in notification
print("no userInfo dictionary in notification")
}
}
我直接在keyboardWasShown中檢查了活動字段,但是可以用單獨的方法來完成。 就這樣! 該解決方案非常適合我,希望對您有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.