Iphone 在窗口级别获取键盘框架

Iphone 在窗口级别获取键盘框架,iphone,ios,objective-c,xcode,ipad,Iphone,Ios,Objective C,Xcode,Ipad,我试图在窗口级别获得键盘框架的坐标,与TableCell进行比较,以便在滚动时进行微调,使单元格中选定的文本字段不会位于键盘或标题后面 然而,我在获取窗口级别键盘的x,y坐标时遇到了问题,它们只是返回0,0(原点),这是不正确的。如果是的话,这不是我需要的 我用的是: CGRect keyboardFrame = [self.view.window convertRect:_numericKeyboardView.frame toView:nil]; NSLog(@"Keyboard Frame

我试图在窗口级别获得键盘框架的坐标,与TableCell进行比较,以便在滚动时进行微调,使单元格中选定的文本字段不会位于键盘或标题后面

然而,我在获取窗口级别键盘的x,y坐标时遇到了问题,它们只是返回0,0(原点),这是不正确的。如果是的话,这不是我需要的

我用的是:

CGRect keyboardFrame = [self.view.window convertRect:_numericKeyboardView.frame toView:nil];
NSLog(@"Keyboard Frame: %f, %f, %f, %f", keyboardFrame.origin.x, keyboardFrame.origin.y, keyboardFrame.size.width, keyboardFrame.size.height);
生成输出(用于纵向)的:

当它应该更像:

Keyboard Frame: 415.000000, 0.000000, 768.000000, 264.000000  
关于如何获得正确的键盘坐标有什么想法吗

来自

您需要注册键盘通知,如

 [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(keyboardWasShown:)
            name:UIKeyboardDidShowNotification object:nil];
然后


并且不要忘记在您的
dealloc
方法中删除self form notification center

如果您想这样做,您可能将
convertRect:toView:
发送给了错误的接收者。Do
[\u numericKeyboardView convertRect:\u numericKeyboardView.bounds to view:nil]

你的问题有误导性。听起来您的“键盘”是一个自定义视图,而不是系统键盘。问题应该是“获取窗口坐标中的视图框架”。
convertRect:toView
方法将起作用,但您可以将其反向使用

将代码更改为:

CGRect keyboardFrame = [_numericKeyboardView convertRect:_numericKeyboardView.bounds 
                                                  toView:self.view.window];

当键盘一分为二时会怎样?那就有两帧了。我不明白你说的一分为二是什么意思?我真的只需要键盘相对于iphone/ipad屏幕的X坐标。在ipad上的iOS 5+下,你可以将键盘“向上”移动,然后它分成两部分:这是一个没有该功能的自定义键盘。啊,对不起,我没有注意到。我已经收到了键盘显示的通知。我正在尝试在文本字段内检查,但我正在编辑我的检查。您的解决方案在纵向模式下返回的似乎是键盘,即使您处于横向模式,这显然会导致值不正确。你知道有什么解决办法吗?我也有同样的问题。我认为这是一个错误。我在我的方法中检查了界面方向,如果是横向的,则检查了倒置的宽度和高度。我在回答中没有提到这一点,因为我希望它已经被修复:)如果你还想知道,我发现了为什么这些值是颠倒的。这是因为旋转设备时原点不在屏幕的左上角。0,0原点随其所附着的角移动(正常纵向中的左上角,而不是倒置),因此当您转动设备时,该角也会转动。抛出所有值这是不正确的-rect应该是_numericKeyboardView.bounds。视图的框架在其superview的坐标系中指定。Per UIView docs:rect参数是“在接收器的本地坐标系(边界)中指定的矩形”:此行返回结果
键盘帧:0.000000、416.000000、1024.000000、352.000000,这似乎是正确的。我会进一步测试,但我相信就是这样。
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGRect kbFrame = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
}
CGRect keyboardFrame = [_numericKeyboardView convertRect:_numericKeyboardView.bounds 
                                                  toView:self.view.window];