縦向きの高さと横向きの高さをポイントで測定します。
縦向きの高さと横向きの高さをポイントで測定します。
回答:
iOS 7.1でキーボードのフレームを決定するために、次のアプローチを使用しました。
ビューコントローラのinitメソッドで、UIKeyboardDidShowNotification
:に登録しました。
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardOnScreen:) name:UIKeyboardDidShowNotification object:nil];
次に、次のコードを使用してkeyboardOnScreen:
、キーボードのフレームにアクセスしました。このコードは、userInfo
通知から辞書を取得し、にNSValue
関連付けられたにアクセスしUIKeyboardFrameEndUserInfoKey
ます。次に、CGRectにアクセスして、ViewControllerのビューの座標に変換できます。そこから、そのフレームに基づいて必要な計算を実行できます。
-(void)keyboardOnScreen:(NSNotification *)notification
{
NSDictionary *info = notification.userInfo;
NSValue *value = info[UIKeyboardFrameEndUserInfoKey];
CGRect rawFrame = [value CGRectValue];
CGRect keyboardFrame = [self.view convertRect:rawFrame fromView:nil];
NSLog(@"keyboardFrame: %@", NSStringFromCGRect(keyboardFrame));
}
迅速
そして、Swiftでの同等の実装:
NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil)
@objc
func keyboardDidShow(notification: Notification) {
guard let info = notification.userInfo else { return }
guard let frameInfo = info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardFrame = frameInfo.cgRectValue
print("keyboardFrame: \(keyboardFrame)")
}
iOS 8では、オンスクリーンキーボードのサイズが異なる場合があることを忘れないでください。オンスクリーンキーボードが常に表示される(特定の高さで)または非表示になると想定しないでください。
現在、iOS 8では、ユーザーはテキスト予測領域のオンとオフをスワイプすることもできます...これを行うと、アプリのkeyboardWillShow
イベントが再び開始されます。
これにより、多くのレガシーコードサンプルが破損します。これkeyboardWillShow
は、画面キーボードの現在の高さを測定するだけのイベントを作成し、この(絶対)量だけページ上でコントロールを上下にシフトすることを推奨していました。
つまり、keyboardWillShow
イベントを追加し、キーボードの高さを測定してから、コントロールの高さをこの量だけサイズ変更するように指示するサンプルコードが表示された場合、これは常に機能するとは限りません。
上記の例では、次のサイトのサンプルコードを使用しましたconstant
。これは、垂直方向の制約値をアニメーション化します。
私のアプリでUITextView
は、画面の下部に設定された制約を追加しました。画面が最初に表示されたとき、この最初の垂直距離を保存しました。
次に、keyboardWillShow
イベントが開始されるたびに、(新しい)キーボードの高さをこの元の制約値に追加します(制約によってコントロールの高さが変更されます)。
ええ。それは醜いです。
そして、XCode 6のひどく痛いAutoLayoutが、コントロールの下部を画面の下部またはオンスクリーンキーボードの上部に接続するだけではないことに、少しイライラ/驚きました。
おそらく私は何かが欠けています。
私の正気以外。
キーボードの高さは、ポートレートモードで216ポイント、ランドスケープモードで162ポイントです。
バージョンノート:カスタムキーボードサイズをサポートしているため、これはiOS9および10では値がなくなりました。
これは、モデルとQuickTypeバーによって異なります。
キーボードの高さは、モデル、QuickTypeバー、ユーザー設定によって異なります...最良のアプローチは、動的に計算することです。
Swift 3.0
var heightKeyboard : CGFloat?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardShown(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
}
func keyboardShown(notification: NSNotification) {
if let infoKey = notification.userInfo?[UIKeyboardFrameEndUserInfoKey],
let rawFrame = (infoKey as AnyObject).cgRectValue {
let keyboardFrame = view.convert(rawFrame, from: nil)
self.heightKeyboard = keyboardFrame.size.height
// Now is stored in your heightKeyboard variable
}
}
最新の答えが見つからないので、シミュレーターで全部チェックします(iOS 11.0)
デバイス| 画面の高さ| ポートレート| 風景
iPhone 4s | 480.0 | 216.0 | 162.0
iPhone 5、iPhone 5s、iPhone SE | 568.0 | 216.0 | 162.0
iPhone 6、iPhone 6s、iPhone 7、iPhone 8、iPhone X | 667.0 | 216.0 | 162.0
iPhone 6 plus、iPhone 7 plus、iPhone 8 plus | 736.0 | 226.0 | 162.0
iPad第5世代、iPad Air、iPad Air 2、iPad Pro 9.7、iPad Pro 10.5、iPad Pro 12.9 | 1024.0 | 265.0 | 353.0
ありがとう!
iPhone
KeyboardSizes:
2.6S、6、7、8:(375×667):keyboardSize =(0.0、407.0、375.0、260。
3.6 +、6S +、7 +、8 + :( 414×736)keyboardSize =(0.0、465.0、414.0、271.0)
4.XS、X:(375 X 812)keyboardSize =(0.0、477.0、375.0、335.0)
5.XR、XSMAX((414 x 896)keyboardSize =(0.0、550.0、414.0、346.0)