2017-12-02 11 views
1

私はできるだけ早くしようとします。私は高さ0のコンテナを持つメインビューを持っており、キーボードが有効になっているときはコンテナをキーボードの同じ高さに設定し、私はボタンと電子メールフィールドを持っており、このコンテナには基本的に制約を設定しています要素を押し上げる。ビューがロードされ、メインビューで正常に機能しているときにキーボードを有効にするように設定しましたが、ボタンを押して次のビューに移動するとキーボードが開きますが、ボタンと電子メールフィールドはキーボードの後ろにとどまります制約が働いていないので、私はホームボタンを押して(バックグラウンドではなく)アプリケーションを閉じてそれを開いたとき、制約は正常に動作します。これは、ナビゲーションコントローラをメインビューに埋め込む場合にのみ発生します。そうでない場合は、完全に動作します。何か案は?ナビゲーションコントローラで動作しない制約

私は両方のビューで全く同じコードを持っています。 Ps:長いポストに申し訳ありません、私はそれを説明する方法を知らなかった。

@IBOutlet weak var emailTF: UITextField! 

@IBOutlet weak var bottomHeight: NSLayoutConstraint!` 

override func viewWillAppear(_ animated: Bool) 
{ 
    super.viewWillAppear(animated) 

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

    // Show keyboard by default 
    emailTF.becomeFirstResponder() 
} 

@objc func keyboardWillShow(_ notification: Notification) 
{ 
     if let userInfo = notification.userInfo 
    { 
     if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue 
     { 
      bottomHeight.constant = keyboardSize.height 
      view.setNeedsLayout() 
     } 
    } 
} 

更新:問題の一部が見つかりました。 2番目のビューをロードするときにキーボードの高さを取得できませんでしたが、2番目のビューコードを「viewWillAppear」から「viewDidAppear」に変更し、コンテナをキーボードの高さにしましたが、別の問題があります。最初のビューをロードすると、キーボードの高さが271(これは正しい)になります。2番目のビューに移動すると何らかの理由でキーボードの高さが226になり、textFieldを45に移動させます。戻るボタンを2番目のビューから最初に戻すには、キーボードの高さは226です。私はホームボタンを押して、アプリケーションを再開しても、どの画面でも問題はありません。キーボードの高さは271 。私が間違っていることは何ですか?

更新2:解決済み!

私のコードはナビゲーションコントローラなしでしか動作していなかったので、ナビゲーションコントローラが持っていたものがすばらしいアニメーションとトランジションのもので、ロード前にコードを読み取ることができないと感じたので、コード行 emailTF.resignFirstResponder()私のボタンアクションとそれは働いた!だから、基本的に私は次のビューでそれを読み込む前にキーボードを却下しなければならなかった。私は同じ問題を抱えているユーザーを助けてくれることを願っています。

答えて

0

最初に、変更されているビューを含むVCがtextfield/textviewのデリゲートであることを確認してから、viewWillAppearから.becomeFirstResponder()を呼び出します。キーボード通知を正しく登録/登録解除していることを確認してください。可能であれば、(デフォルトのUIViewを超えて)スクロールビューを使用して、制約を変更する代わりにViewControllersサブビューを含めることができます。

func registerForKeyboardNotifications(){ 
    //Adding notifies on keyboard appearing 
    NotificationCenter.default.addObserver(forName: Notification.Name.UIKeyboardWillShow, object: nil, queue: nil, using: keyboardWasShown) 
    NotificationCenter.default.addObserver(forName: Notification.Name.UIKeyboardWillHide, object: nil, queue: nil, using: keyboardWillBeHidden) 
} 

func deregisterFromKeyboardNotifications(){ 
    //Removing notifies on keyboard appearing 
    NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardDidShow, object: nil) 
    NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardWillHide, object: nil) 
} 

func keyboardWasShown(notification: Notification) -> Void { 
    //Need to calculate keyboard exact size due to Apple suggestions 
    self.scrollView.isScrollEnabled = true 
    var info = notification.userInfo! 
    var keyboardSize:CGRect = (info[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue 
    if keyboardSize.size.height <= 0 { // to fix bug on iOS 11 
     keyboardSize = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue 
    } 
    self.scrollView.contentInset.bottom = keyboardSize.height //add this much 
    self.scrollView.scrollIndicatorInsets.bottom = keyboardSize.height //scroll too it. 

    var aRect : CGRect = self.view.frame 
    aRect.size.height -= keyboardSize.height 
    if let activeField = self.activeTextView { 
     if (!aRect.contains(activeField.frame.origin)){ 
      self.scrollView.scrollRectToVisible(activeField.frame, animated: true) 
     } 
    } 
} 

func keyboardWillBeHidden(notification: Notification){ 
    self.scrollView.contentInset.bottom = 0 
    self.scrollView.isScrollEnabled = true 
    self.scrollView.alwaysBounceVertical = true 
} 
+0

私は既にこの問題を発見し、投稿を更新しました。あなたはscrollViewについて言及しましたが、私の場合はうまくいくでしょう。なぜなら、ただ1つの要素を上に移動したいし、scrollViewを使うと複雑になるからです。助けてくれてありがとう! –

+0

@ AlexandreD'Acol私はいつも、ビューをスクロールビューに置き換えて上の再利用可能なコードを追加する方が簡単だと感じました。あなたがそれを固定聞いてよかった!あなたのプロジェクトで世話をして幸運を祈る! – RLoniello

+0

これについて知っておいて、私はこの方法を使ったことはありませんが、私は間違いなく試してみます。ありがとう! –

0

)(代わりにview.setNeedsLayoutのself.view.layoutIfNeededのコード行を()を使用し

そして、あなたは正しい高さを取得したりしていないキーボードの高さについて確認してください。

ありがとうございます!

+0

ありがとうございますが、動作していない、私はコードの行を変更し、何も。また、ビューからナビゲーションコントローラを削除するとうまくいきますので、キーボードの高さも適切です。また、私はナビゲーションコントローラを削除し、segueから "アニメーション"ボックスのチェックを外すと、どちらも動作しません。何かが制約の読み込みを妨げているように見えます。アニメーションがあると、制約が正しく働くようになります。 –

+0

なぜあなたはそのボックスのチェックを外しましたか?この場合、制約は機能しません。 – iDev750

+0

前にも述べたように、私はテストのためだけにコードを実行していませんでした。 –

関連する問題