以点为单位测量的纵向高度和横向高度。
我在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)")
}
需要注意,在iOS 8中,屏幕键盘的大小 可能 会有所变化。不要假设屏幕键盘将始终可见(具有特定高度)或不可见。
现在,在iOS 8中,用户还可以上下滑动文本预测区域...当他们这样做时,它会再次触发应用程序的 keyboardWillShow
事件 again。
这将会破坏很多传统代码示例,其中建议编写一个 keyboardWillShow
事件,仅测量屏幕键盘的当前高度,并通过此(绝对)值向上或向下移动页面上的控件。
换句话说,如果您看到任何示例代码,只告诉您添加一个 keyboardWillShow
事件,测量键盘高度,然后按此调整控件高度,则这种方法将不再总是奏效。
在上面的示例中,我使用了以下网站的示例代码,该示例代码会动画显示垂直约束 constant
值。
在我的应用程序中,我添加了一个约束到我的 UITextView
,设置为屏幕底部。当屏幕首次出现时,我存储了这个初始垂直距离。
然后,每当我的 keyboardWillShow
事件被触发时,我将(新的)键盘高度添加到此原始约束值中(因此约束调整控件的高度)。
是的。 这很丑陋。
我有些恼怒/惊讶于Xcode 6糟糕的AutoLayout,它不能仅仅允许我们将控件底部附着在屏幕底部或屏幕键盘顶部。
也许我错过了什么。
除了我的理智。
在竖屏模式下,键盘高度为216个点,而在横屏模式下,键盘高度为162个点。
键盘高度取决于型号、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模拟器上进行了检查:
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 |