2016-05-23 2 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

Я знаю, что это старое сообщение, но у меня была такая же проблема, и я решил это с помощью небольшого трюка. Я размещаю здесь свое решение, которое может быть полезно для кого-то другого.

Хитрость заключается в том, чтобы назначить значение для свойства тега всех моих текстовых просмотров, а затем в моей клавиатуре метод WasShown прочитал его и, в зависимости от этого значения, я знаю, какой текст был выбран. Некоторые коды помогут вам понять, что я сделал:

я объявил мой TextViews и ИНТ переменная для хранения значения тега выбранного 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 и перемещать 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, но это может быть сделано в отделенном методе. Вот и все! Это решение отлично сработало для меня, надеюсь, это поможет кому-то другому!

Смежные вопросы