web-dev-qa-db-ja.com

iPhone XとiPhone 8のキーボードの高さが異なります

以下のコードを使用して、キーボードの高さを取得します。次に、この高さを使用して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)
        } 
    }

この画像のように、緑の境界線が余分な部分になります。実際、キーボードの上部にある緑色の長方形の隙間のない赤い部分が必要です。 enter image description here

編集

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のように異なる場合があります。

37
William Hu

IPhone XとiPhone 8の両方のキーボードの高さは正しいはずです。 「赤い部分」を見つけるためのコードに問題があるのではないかと推測できます。実際には、ビューのlocationに問題があるのに対して、キーボードの高さが間違っていると仮定しました。今-場所の問題の理由は? 2番目の推測は、赤い部分が下部のセーフエリアレイアウトガイドに固定されていることです。このガイドは、iPhone 8では0ですが、iPhone Xでは34ポイントはめ込まれています。

キーボードの高さの違いと、NSNotificationメソッドでkeyboardWillShowメソッドで報告されたキーボードの高さからのキーボードの高さを使用して、キーボードのすぐ上に長方形を描くことができることの両方を示すこの画像を参照してください:

enter image description here

赤いビューを配置するためのコード/制約を共有したい場合、問題を表示できるはずです。

-Edit:描画した赤い長方形を抽出する方法を知りたい人は、ブログの投稿でそれを調べます こちら

34
Craig Grummitt

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
}
39
Kqtr

これは、これまでのすべてのデバイスと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];
}
3
Fede Henze

私もこの問題に直面しました。私がやったことは、iPhone 7とiPhone Xで異なるキーボードをチェックするだけです。キーボードの高さにデフォルトのマージンを追加するだけです。現在、すべてのデバイスで正常に動作しています。

0
iDev750

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()
    }

}
0
Sakshi Singla