簡體   English   中英

顯示鍵盤時UITextView不會滾動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM