以下のコードを使用して、キーボードの高さを取得します。次に、この高さを使用してUIView
のフレームを計算し、このUIView
がキーボードのすぐ上にあることを確認します。
ただし、iPhoneXシミュレーターの出力は333
で、iPhone 8シミュレーターは258
です。
ISSUE:iPhone 8シミュレーターのキーボードの高さとしてrect.height
を使用する場合、レイアウトは正しいです。 iPhone Xの場合、UIView
とキーボードの間に隙間があります。つまり、333
はiPhone Xの実際のキーボードの高さよりも高くなります。
高さが異なる理由は何ですか?そして、正しいキーボードの高さを取得する方法は?
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
@objc func keyboardWillShow(_ notification: NSNotification) {
if let rect = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
print(rect.height)
}
}
この画像のように、緑の境界線が余分な部分になります。実際、キーボードの上部にある緑色の長方形の隙間のない赤い部分が必要です。
編集
OK、@ Craigの助けを借りて、このメソッドはiPhone Xによってのみ呼び出されることがわかりました。そこで、ここでフレームを更新します。ここにコードを貼り付けてください。
セーフエリアの底の高さは22.0であるようです。
override func viewSafeAreaInsetsDidChange() {
if #available(iOS 11.0, *) {
super.viewSafeAreaInsetsDidChange()
view.safeAreaInsets.bottom // This value is the bottom safe area place value.
}
}
EDIT2通常view.safeAreaInsets.bottom
は34.0でなければなりませんが、コンテナビューを使用している場合、この値は私のものが22.0のように異なる場合があります。
IPhone XとiPhone 8の両方のキーボードの高さは正しいはずです。 「赤い部分」を見つけるためのコードに問題があるのではないかと推測できます。実際には、ビューのlocationに問題があるのに対して、キーボードの高さが間違っていると仮定しました。今-場所の問題の理由は? 2番目の推測は、赤い部分が下部のセーフエリアレイアウトガイドに固定されていることです。このガイドは、iPhone 8では0ですが、iPhone Xでは34ポイントはめ込まれています。
キーボードの高さの違いと、NSNotification
メソッドでkeyboardWillShow
メソッドで報告されたキーボードの高さからのキーボードの高さを使用して、キーボードのすぐ上に長方形を描くことができることの両方を示すこの画像を参照してください:
赤いビューを配置するためのコード/制約を共有したい場合、問題を表示できるはずです。
-Edit:描画した赤い長方形を抽出する方法を知りたい人は、ブログの投稿でそれを調べます こちら 。
Craigの答え は正しいですが、ビューをview.bottomまたはbottomLayoutGuideセーフエリアbottomではなく(特にキーボードが常に開いているわけではなく、ビューが[ホームインジケータ]エリアをカバーしないようにします)。
これらの場合の修正を次に示します。キーボードの高さから安全領域の下部インセットの高さを差し引きます:
var keyboardHeight = ... // Get the keyboard height from keyboard notification
if #available(iOS 11.0, *) {
let bottomInset = view.safeAreaInsets.bottom
keyboardHeight -= bottomInset
}
これは、これまでのすべてのデバイスとiOSバージョンで機能します
- (void)keyboardWillShown:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGFloat kbHeight = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
CGFloat safeAreaBottomInset = 0;
if (@available(iOS 11.0, *)) {
safeAreaBottomInset = self.view.safeAreaInsets.bottom;
}
self.containerViewBottomConstraint.constant += (kbHeight - safeAreaBottomInset); //In my case I use a constraint to adapt the UI when the keyboard is presented
[self.view layoutIfNeeded];
}
私もこの問題に直面しました。私がやったことは、iPhone 7とiPhone Xで異なるキーボードをチェックするだけです。キーボードの高さにデフォルトのマージンを追加するだけです。現在、すべてのデバイスで正常に動作しています。
func viewDidLoad()をオーバーライドします{super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
//Here keyboard is without any toolbar and suggestions boxes
@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
let keyboardHeight = ((keyboardSize.height) > 240) ? 220 : (keyboardSize.height - 47)
self.view.layoutIfNeeded()
}
}