2017-01-30 5 views
0

私は内部のscrollviewとビューコントローラを持っていると私は、ストーリーボードに(自動レイアウトで)この方法でそれを設定します。スクロールビューとキーボードの問題スウィフト

Example

あなたは私がすべてのオブジェクトを追加見ることができるようにスクロールビュー内の最後のビュー( 'Viewsotto'と呼ばれる) 私の問題は次のとおりです: これらのオブジェクトのいくつかはテキストフィールドです。私はそれをタップするとキーボードがテキストフィールドの下に来るようにしたいので、私はそれを書くことができます。

NotificationCenter.default.addObserver(self, selector: #selector(userProfiloGiusto.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(userProfiloGiusto.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 

func keyboardWillShow(notification: NSNotification) { 

     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
      if self.view.frame.origin.y == 0{ 
       self.view.frame.origin.y -= keyboardSize.height 
      } 
     } 

    } 

    func keyboardWillHide(notification: NSNotification) { 
     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
      if self.view.frame.origin.y != 0{ 
       self.view.frame.origin.y += keyboardSize.height 
      } 
     } 
    } 

が、それは動作しません:私はこの方法でそれを行う。このため 。私は間違って何をしていますか?

+0

チェックする必要はありません。https://github.com/hackiftekhar/IQKeyboardManager – karthikeyan

+0

@karthikeyanは正しいです。その実装も簡単です。 – vaibby

+0

ありがとうございます。すごい!! –

答えて

0

下記のコードを試してください。 最初に、確認のためにvar activeField: UITextField?を追加してください。

override func viewDidLoad() { 
    super.viewDidLoad()self.registerForKeyboardNotifications() 

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard)) 
    view.addGestureRecognizer(tap) 
    tap.cancelsTouchesInView = false} 


func registerForKeyboardNotifications() 
{ 
    //Adding notifies on keyboard appearing 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ProfileReviewViewController.keyboardWasShown(_:)), name: UIKeyboardWillShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ProfileReviewViewController.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) 
{ 
    //Need to calculate keyboard exact size due to Apple suggestions 
    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 
    { 
     if (CGRectContainsPoint(aRect, activeField!.frame.origin)) 
     { 
      scrollView.scrollRectToVisible(activeField!.frame, animated: true) 
     } 
    } 
} 

func keyboardWillBeHidden(notification: NSNotification) 
{ 
    self.scrollView.contentInset = UIEdgeInsetsZero 
} 
//MARK : Textfield delegate methods 
func textFieldDidBeginEditing(textField: UITextField) { 
    activeField = textField 
} 

func textFieldShouldReturn(textField: UITextField) -> Bool { 

    self.view.endEditing(true) 
    activeField = nil 
    return false 
} 
func textFieldShouldEndEditing(textField: UITextField) -> Bool { //delegate method 

    activeField = nil 
    return true 
} 
func dismissKeyboard() { 
    //Causes the view (or one of its embedded text fields) to resign the first responder status. 

    activeField = nil 
    view.endEditing(true) 
} 
0

おそらくあなたは、重複があるかどうか理解するために使用している測定値が正しくない: は、次にビューにロードコールこの機能をしました。
これは一般的な問題です。メインビューでそれらに直面していますが、代わりにテキストフィールドのフレームを取得し、キーボードが重なっているかどうかを確認し、スクロールビューのコンテンツのインセットを調整します。
これは、Managing the keyboardの説明書で詳しく説明されています。
キーボードが表示されたら:

func keyboardWasShown(notification: NSNotification) 
{ 
    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 

    // If active text field is hidden by keyboard, scroll it so it's visible 
    // Your app might not need or want this behavior. 
    var aRect : CGRect = self.view.frame 
    aRect.size.height -= keyboardSize.height 
    if let actField = activeField 
    { 
     if (CGRectContainsPoint(aRect, actField.frame.origin)) 
     { 
      scrollView.scrollRectToVisible(actField.frame, animated: true) 
     } 
    } 
} 

重要な点は、彼らがビューの高さを要求したとき、彼らはキーボードの高さを引いていると、彼らはテキストビューのチェックは、その領域内にあります。
この計算はビューの階層に関連して変わることがあります。これは、ビューの位置がスーパービューを尊重しているためです。したがって、rectが別のビューの内側にある場合、フレームを変換してメインビューに関連しています。

関連する問題