iPhone屏幕键盘的高度是多少?

87

以点为单位测量的纵向高度和横向高度。


2
在这里,您可以找到iPhone的所有尺寸:iPhone尺寸 - Pfitz
3
不要使用那个最后的“iPhone尺寸”链接!它是2011年发布的,在iOS 8之前,无法考虑到屏幕键盘高度的变化。 - Mike Gledhill
@MikeGledhill 在 iOS 8 之前,屏幕键盘的高度就已经有所不同了。 - ReDetection
相关:如果您正在寻找键盘高度的实际值(例如用于调试目的),请参阅iOS外语键盘高度? - Senseful
7个回答

215

我在iOS 7.1中使用以下方法来确定键盘的框架。

在我的视图控制器的init方法中,我注册了UIKeyboardDidShowNotification

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardOnScreen:) name:UIKeyboardDidShowNotification object:nil];

接着,在 keyboardOnScreen: 中,我使用了以下代码来访问键盘的框架。这段代码从通知中获取 userInfo 字典,然后访问与 UIKeyboardFrameEndUserInfoKey 相关联的 NSValue。然后,您可以访问 CGRect 并将其转换为您的视图控制器视图的坐标系。从那里,您可以根据该框架执行任何所需的计算。

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

使用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)")
}

4
虽然看起来有点麻烦,但这肯定比硬编码键盘尺寸要好。正确答案。 - n13
2
投票支持这个答案并对问题进行了反对。楼主显然不知道自己在说什么。大家要小心!这个答案才是正确的! - superarts.org
2
针对横屏的一种补充:if (SYSTEM_VERSION_LESS_THAN(@"8.0")) { _keyboardHeight = keyboardFrame.size.width; } else { _keyboardHeight = keyboardFrame.size.height; } - LiangWang
3
有没有一种方法可以在不弹出键盘的情况下完成这个操作?在我的情况下,我想在键盘后面放置一个与其高度相同的内容(类似于许多通讯应用的做法)。 - John
@superarts.org 没有必要投票反对这个问题;人们很可能会搜索这个问题,现在他们会看到这个答案..所以一切都好 :) - Ja͢ck
显示剩余2条评论

46

需要注意,在iOS 8中,屏幕键盘的大小 可能 会有所变化。不要假设屏幕键盘将始终可见(具有特定高度)或不可见。

现在,在iOS 8中,用户还可以上下滑动文本预测区域...当他们这样做时,它会再次触发应用程序的 keyboardWillShow 事件 again

这将会破坏很多传统代码示例,其中建议编写一个 keyboardWillShow 事件,仅测量屏幕键盘的当前高度,并通过此(绝对)值向上或向下移动页面上的控件。

enter image description here

换句话说,如果您看到任何示例代码,只告诉您添加一个 keyboardWillShow 事件,测量键盘高度,然后按此调整控件高度,则这种方法将不再总是奏效。

在上面的示例中,我使用了以下网站的示例代码,该示例代码会动画显示垂直约束 constant 值。

Practicing AutoLayout

在我的应用程序中,我添加了一个约束到我的 UITextView,设置为屏幕底部。当屏幕首次出现时,我存储了这个初始垂直距离。

然后,每当我的 keyboardWillShow 事件被触发时,我将(新的)键盘高度添加到此原始约束值中(因此约束调整控件的高度)。

enter image description here

是的。 这很丑陋。

我有些恼怒/惊讶于Xcode 6糟糕的AutoLayout,它不能仅仅允许我们将控件底部附着在屏幕底部或屏幕键盘顶部。

也许我错过了什么。

除了我的理智。


实际上,键盘尺寸总是会有所变化,即使在旧的iOS版本上也是如此。例如,检查手写中文语言。 - ReDetection
哎呀,我没意识到这一点。我只是觉得很奇怪,为什么那么多“keyboardWillShow”的示例总是假定此事件只会在键盘出现或消失时被调用一次,而没有处理键盘停留在屏幕上但更改大小的功能。 - Mike Gledhill
1
@MikeGledhill 我认为你应该使用“UIKeyboardWillChangeFrameNotification”来处理由于旋转或显示/隐藏文本预测栏而导致的框架更改... - Abdalrahman Shatou
我刚刚用我的应用程序进行了测试。无论是让键盘出现还是打开或关闭文本预测区域,UIKeyboardWillChangeFrameNotification 总是会被调用,同时也会触发keyboardWillShow事件。所以它并没有太大的帮助。我的意思是...用户需要对这些事件有点小心,仅此而已。 - Mike Gledhill
1
为什么这个没有更多的关注? - rfoo

30

在竖屏模式下,键盘高度为216个点,而在横屏模式下,键盘高度为162个点。

来源


140
如果你想发布自问自答的问题,那么至少给出像样的答案。键盘的尺寸应该从通知对象获取,而不是从某个网站硬编码的值。请参见这里 - jrturton
18
问题不在于如何以编程方式查找高度。这个问题不仅对程序员有用,对于图形设计师等其他人也很有用。你正在寻求的答案属于另一个问题。事实上,已经有另一个问题包含了那个答案:stackoverflow.com/a/7302291/310121 - Erik B
48
注意,键盘的大小取决于语言和键盘类型。 - Gabriel
13
为了你自己的利益,请勿使用硬编码数值!举一个强有力的例子,用户可能正在使用分裂(双部分)键盘,该键盘对高度并不是很在意。 - Timo
6
这个答案懒惰且危险。请从UIKeyboardDidShowNotification中获取键盘高度,因为实际值往往会在iOS主要版本之间发生变化。请参见下面的Ken的答案。 - Alexander
显示剩余5条评论

17

1
版本说明:自从iOS 9和10开始支持自定义键盘大小后,此功能已不再适用。 - Raptor

11

键盘高度取决于型号、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
   }
}

10

我找不到最新的答案,所以我在所有的iOS 11.0模拟器上进行了检查:

iOS 11设备 屏幕高度 竖屏 横屏
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第五代,iPad Air,iPad Air 2,iPad Pro 9.7,iPad Pro 10.5,iPad Pro 12.9 1024.0 265.0 353.0

2
我创建了这个表格,其中包含iPhone和iPad键盘的高度,分别为横屏和竖屏模式,并分别带有工具栏和不带有工具栏的状态。
我甚至在这里解释了如何在代码中使用这些尺寸。
请注意,只有在需要在布局视图之前知道键盘尺寸的情况下才应使用这些尺寸。否则,其他答案中的解决方案更好。
图片链接: enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接