1

私のカスタム キーボードupdateConstraintsでは、キーボードの高さを増やす制約を追加します。これにより、サブビューが (自動レイアウトも使用して) 新しいサイズに調整されます。レイアウトのサイズ調整が完了し、すべてのサブビューが配置されたら、関数を呼び出す必要があります (後で使用する新しい要素のいくつかの位置を保存し、この新しいレイアウトに応じていくつかの要素を手動で更新するため)。このコードは、デバイスを回転させた後など、サイズが変更され、要素が再配置されたときに再度トリガーする必要があります。そのコードを実行するには、どの関数を使用する必要がありますか?

viewDidAppearは一度しか呼び出されませんが、その時点ではキーボードのサイズが調整されていないため、それは時期尚早です。

updateViewConstraints更新された制約に応じてサブビューがまだレイアウトされていないため、機能しません。関数を呼び出す前に更新を強制的に実行しようとして呼び出しをself.view.setNeedsLayout()試みself.view.layoutIfNeeded()ましたが、違いはありませんでした。キーボードがサブビューのレイアウトを完了する前に関数を実行します。

私は試しviewDidLayoutSubviewsてみましたが、ビューが落ち着いた後に呼び出されますが、問題は、キーボードでコレクション ビューをスクロールしているときに、この関数が 100 万回呼び出されることです。スクロール中にその関数を呼び出すことはできません。キーボードのサイズが変更され、ビューが定位置に落ち着いた後、一度しか呼び出すことができません。

viewDidAppear遅延後に呼び出し、さらに遅延後にローテーション メソッドで呼び出すことも考えましviewWillTransitionToSizeたが、これは非常に脆弱です。脆弱性を軽減するために遅延を増やすこともできますが、すべてができるだけ早く更新されるように、このメソッドができるだけ早く呼び出されるようにしたいと考えています。

4

1 に答える 1

0

iOS 8.3 より前にこの問題に取り組んだときの私の経験では、これに対する特効薬はありません。あなたがやっていることに対するあなたのニーズが何であるか正確にはわかりませんが、私が試したいくつかの可能な解決策は次のとおりです。

初め; キーボードが最終的に「目的の」サイズに更新されると想定し、それに基づいてレイアウトを実行しますviewDidLayoutSubviews。サイズ変更のためのレイアウトを 1 回行うと、方向を変更したことを検出した場合を除いて、再度行うことはありません。これには、a) 高さの制約が更新されるまでの間、キーボードが画面に部分的にしか表示されない、b) 場合によっては高さの制約が守られず、キーボードの形が崩れたままになるという欠点があります (これはタイマーで解決できますが、あなたが観察したように、かなり壊れやすいです)、c) iPhone 6/6+ の「網膜用にスケーリングされた」アプリでこれを適切に機能させるのは難しいでしょう.

2番; の高さがいつUIInputView変化したかを検出し、その情報をコレクション ビューに渡します。これにより、これが発生した場合にのみ再レイアウトされます。私の経験では、これはおそらく必要以上に 2 回しか発生しません。

三番; コレクションビューがスクロールしているときを検出し (スクロールビューからのコールバックにサインアップできます)、これが発生している間はコストのかかるレイアウト操作を実行しないでください。これも非常に壊れやすいです。

何をするにしても、Retina 用にスケーリングされたアプリを使用しているとき、ステートフルなレイアウト操作の実行中にユーザーがパスワード フィールドに入力したとき、ユーザーがキーボードを閉じたときに何が起こるかを必ずテストしてください。ユーザーがキーボード UI の割り当てを解除して再利用する前にキーボードを閉じて再度開いた場合 (通常、ポップアップではなくアニメーションでスライドアップする場合) など、無効な状態になる可能性があります。注意しないと、将来の操作、またはタイマーからのキーボード UI への参照サイクルおよび/または強い参照を台無しにします。

要素の位置を格納する場合も、何をしているのかわかりませんが、これらのプロパティを格納するよりも直接読み取る方がよいでしょう。状態が多いほど、潜在的な問題が多くなります。

最後のコメント - 私はこれを自分でテストしていませんが、サードパーティのキーボードの自動レイアウトが非常に遅いと報告している人もいます - あなたはそれを使用してビューをレイアウトすることを暗示しているようです - 私はプロファイリングして確認します問題を引き起こしているのは実際にはあなたのコードであり、キーボードがポップするのに許容できないほど長い時間がかかると思います。

これがお役に立てば幸いです。

于 2015-05-17T23:54:25.150 に答える