私はできるだけ早くしようとします。私は高さ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()
私のボタンアクションとそれは働いた!だから、基本的に私は次のビューでそれを読み込む前にキーボードを却下しなければならなかった。私は同じ問題を抱えているユーザーを助けてくれることを願っています。
私は既にこの問題を発見し、投稿を更新しました。あなたはscrollViewについて言及しましたが、私の場合はうまくいくでしょう。なぜなら、ただ1つの要素を上に移動したいし、scrollViewを使うと複雑になるからです。助けてくれてありがとう! –
@ AlexandreD'Acol私はいつも、ビューをスクロールビューに置き換えて上の再利用可能なコードを追加する方が簡単だと感じました。あなたがそれを固定聞いてよかった!あなたのプロジェクトで世話をして幸運を祈る! – RLoniello
これについて知っておいて、私はこの方法を使ったことはありませんが、私は間違いなく試してみます。ありがとう! –