0

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

userInfo从使用中获取 UIKeyboards 框架UIKeyboardFrameEndUserInfoKey并进行数学运算以使视图看起来像是堆叠在键盘顶部时,我需要相差 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 像素的差异。

真正让我震惊的是,在使用时UIKeyboardFrameBeginUserInfoKey,键盘的框架位于屏幕底部,这是正确的,但结束框架导致我编码了 20 像素的差异。当我添加转换代码时,它会将键盘向上 20 像素,从而消除差异。这到底是怎么回事?

4

1 回答 1

1

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

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

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

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

我希望这能帮到您。

关于 Retina 显示和测量的注意事项:
在 iOS 上,您永远不会在代码中处理 Pixel(仅在准备资产时),您总是处理 Point。所以状态栏总是 20 点,无论是否在 Retina 上。

于 2012-11-24T19:26:33.953 回答