我需要有人向我解释,因为它没有任何意义。
当使用userInfo
从UIKeyboardFrameEndUserInfoKey
获取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像素差异。
真正让我感到惊讶的是,当使用UIKeyboardFrameBeginUserInfoKey
时,键盘的框架位于屏幕的底部,这是正确的,但结束帧会导致我编码20像素的差异。当我添加转换代码时,它将键盘放置20像素,因此摆脱了差异。到底是怎么回事?
答案 0 :(得分:1)
你所描述的是自然和想要的行为 问题是键盘坐标位于Window Coordinate系统中 您的视图可能不在Window Coordinate系统中。所以你总是需要在坐标系之间进行转换才能正确使用它。
真正抛出的是当使用UIKeyboardFrameBeginUserInfoKey时,键盘的框架位于屏幕的底部,这是正确的,
我不同意,你可能比你想象的要低20分(如果你在View坐标系中设置它),但是因为那不在屏幕上你没有注意到偏移。
每个视图都有自己的坐标系统。并且视图的框架在其父坐标系中表示。如果我们不理解这种差异的原因和必要性,这也会导致一些混乱。
我希望这会对你有所帮助。
关于视网膜显示和测量的说明:
在iOS上,您从不在代码中处理Pixel(仅在准备资产时),您始终处理Point。所以状态栏总是20分,在视网膜上或不在。