Ios ui键盘';s帧的间隔为20像素

Ios ui键盘';s帧的间隔为20像素,ios,uikeyboard,Ios,Uikeyboard,我需要有人向我解释这一点,因为它没有任何意义 当使用UIKeyboardFrameEndUserInfoKey从userInfo获取UIKeyboards框架并进行数学运算以使视图看起来像是堆叠在键盘顶部时,我需要做20个像素的差异 数学: CGRect frame = view.frame; CGPoint origin = frame.origin; origin.x = kbFrame.origin.x; origin.y = kbFrame.origin.y - view.frame.s

我需要有人向我解释这一点,因为它没有任何意义

当使用
UIKeyboardFrameEndUserInfoKey
userInfo
获取UIKeyboards框架并进行数学运算以使视图看起来像是堆叠在键盘顶部时,我需要做20个像素的差异

数学:

CGRect frame = view.frame;
CGPoint origin = frame.origin;
origin.x = kbFrame.origin.x;
origin.y = kbFrame.origin.y - view.frame.size.height - 20;
frame.origin = origin;
view.frame = frame;
我想它一定是状态栏,但这里有一个关键点,我正在开发一个视网膜显示器,所以状态栏的高度是40像素,而不是20像素

然后我添加了一个从视图到视图的转换

CGRect kbFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

UIWindow * window = [UIApplication sharedApplication].windows[0];

kbFrame = [self.view convertRect:kbFrame fromView:window];
这似乎是固定的;也就是说,我可以消除20像素的差异


真正让我头疼的是,当使用
UIKeyboardFrameBeginUserInfo键时,键盘的框架位于屏幕底部,这是正确的,但结束帧使我对20像素的差异进行编码。当我添加转换代码时,它会将键盘向上放置20个像素,从而消除差异。到底发生了什么事?

你描述的是一种自然的、想要的行为。
问题是键盘坐标在窗口坐标系中。
您的视图可能不在窗口坐标系中。所以,您始终需要在坐标系之间进行转换才能正确使用它

真正让我吃惊的是,当使用UIKeyboardFrameBeginUserInfo键时,键盘的框架位于屏幕底部,这是正确的

我不同意,您可能比您认为的低20点(如果您在视图坐标系中进行设置),但由于这是在屏幕外,您不会注意到偏移

每个视图都有自己的坐标系,在其边界内。视图的框架用其父坐标系表示。如果我们不理解这种差异的原因和必要性,这也会导致一些混乱

我希望这对你有帮助

关于视网膜显示和测量的注意事项:
在iOS上,您从不在代码中处理像素(仅在准备资产时),您总是处理点。所以状态栏总是20点,在视网膜上还是不在