2016-05-23 9 views
0

Ich habe einen Code implementiert, um den Bildschirm zu scrollen, wenn die Tastatur angezeigt wird, um zu verhindern, dass Felder abgedeckt werden.UITextView scrollt nicht, wenn Tastatur angezeigt wird

Das funktioniert gut für Textfelder, aber es funktioniert nicht für ein UITextView Feld. Hier

ist der Code, den ich implementiert haben:

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 

} 

ich bemerkt habe ist, dass activeTextView ist immer „Null“ einmal in der keyboardWasShown Funktion.

Jede Hilfe würde sehr geschätzt werden, da ich das nicht herausfinden kann.

Danke!

Antwort

0

Ich weiß, das ist ein alter Post, aber ich hatte das gleiche Problem und ich löste es mit einem kleinen Trick. Ich poste hier meine Lösung, die für jemand anderen hilfreich sein könnte.

Der Trick besteht darin, einen Wert der Tag-Eigenschaft aller meiner Textansichten zuzuweisen und dann in meiner keyboardWasShown-Methode zu lesen und, abhängig von diesem Wert, weiß ich, welche Textansicht ausgewählt wurde. Einige Codes helfen Ihnen zu verstehen, was ich tat:

i erklärte mein Textviews und eine int Variable, die den Tag-Wert von ausgewählten Textview zu speichern:

var myTextViewField: UITextView! = nil 
var anotherTextViewField: UITextView! = nil 
var activeTextViewTag: Int = 0 

in viewDidLoad mit allen anderen Eigenschaften i festgelegt haben Tag-Eigenschaft meiner Textviews:

myTextViewField.tag = 1 
anotherTextViewField.tag = 2 

jetzt ist es Zeit, den Tag-Wert zu lesen und ich habe es in textViewDidBeginEditing Methode

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

Am Ende las in keyboardWasShown Verfahren den activeTextViewTag Wert und bewegen Sie den Scroll

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") 
    } 
} 

ich das aktive Feld direkt in keyboardWasShown überprüft, aber es könnte in einem separaten Verfahren durchgeführt werden. Das ist alles! Diese Lösung hat perfekt für mich funktioniert, ich hoffe, dass dies jemand anderem helfen kann!

Verwandte Themen