2016-05-23 198 views
0

我已经实现了一些代码来显示键盘时滚动屏幕,以防止字段被覆盖。键盘显示时UITextView不会滚动

这对文本字段工作正常,但它不适用于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 

} 

我注意到的是,activeTextView始终是“零”,一旦keyboardWasShown函数内。

任何帮助将不胜感激,因为我似乎无法弄清楚这一点。

谢谢!

回答

0

我知道这是一个旧帖子,但我有同样的问题,我用一个小技巧解决了它。我在这里发布我的解决方案,可能对别人有帮助。

诀窍是给我的所有textviews的标签属性赋值,然后在我的keyboardWasShown方法中读取它,并根据这个值,我知道选择了哪个textview。一些代码将有助于你了解我所做的:

我宣布我的textviews和一个int变量来存储选择的TextView的标记值:

var myTextViewField: UITextView! = nil 
var anotherTextViewField: UITextView! = nil 
var activeTextViewTag: Int = 0 
在viewDidLoad中

与我已设置的所有其他属性我textviews的标签属性:

myTextViewField.tag = 1 
anotherTextViewField.tag = 2 

现在是时候来读取标签价值,我做到了在textViewDidBeginEditing方法

func textViewDidBeginEditing(_ textView: UITextView) { 
    activeTextViewTag = textView.tag 
} 

最后,在keyboardWasShown方法读取的activeTextViewTag值和移动所述滚动视图

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检查活动字段,但它可能在一个分离的方法来完成。 就是这样!这个解决方案对我来说非常合适,我希望这可以帮助别人!