iOS 为啥将 ToolBar 间隙移至键盘

Posted

技术标签:

【中文标题】iOS 为啥将 ToolBar 间隙移至键盘【英文标题】:iOS why has moved ToolBar gap to keyboardiOS 为什么将 ToolBar 间隙移至键盘 【发布时间】:2013-07-01 19:42:00 【问题描述】:

我想出了如何使用出现的键盘移动带有按钮和文本字段的工具栏:

- (void) liftMainViewWhenKeybordAppears:(NSNotification*)aNotification

NSDictionary* userInfo = [aNotification userInfo];
NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
CGRect keyboardFrame;

[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
[[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] getValue:&keyboardFrame];


[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:animationDuration];
[UIView setAnimationCurve:animationCurve];    

[self.navigationController.toolbar setFrame:CGRectMake(self.navigationController.toolbar.frame.origin.x,
                                                       self.navigationController.toolbar.frame.origin.y - keyboardFrame.size.height +self.navigationController.toolbar.frame.size.height,
                                                       self.navigationController.toolbar.frame.size.width,
                                                       self.navigationController.toolbar.frame.size.height)];
[UIView commitAnimations];


一切正常,但移动的工具栏和键盘之间有一个小间隙:

我无法找出问题所在?可能是什么问题或者是预期的行为?

谢谢!

【问题讨论】:

我建议检查该空间是否实际上不是工具栏图像的一部分。并且还尝试首先对工具栏的位置进行硬编码,然后检查您的计算值并进行比较(更容易找到问题)。此外,如果您使用自动布局,请检查约束。 你好,丹尼帕塔。感谢您的回答。 1.空间如何成为工具栏的一部分?工具栏是我的导航控制器的一部分。 2. 我去看看。好主意。 3. 我也会检查一下,但布局会出现什么问题?谢谢! 【参考方案1】:

尝试以下方法来计算新的帧大小:

CGRect kbFrameBegin;
[[userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue: &kbFrameBegin];
CGRect kbFrameEnd;
[[userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] getValue: &kbFrameEnd];    
CGRect frame = self.navigationController.toolbar.frame;    
frame.size.height -= abs(kbFrameBegin.origin.y - kbFrameEnd.origin.y);
[self.navigationController.toolbar setFrame:frame];

【讨论】:

您好 Martin,看起来您喜欢我的问题...当我使用您对键盘尺寸的建议时,我得到的行为完全相同。很奇怪…… 好吧,你一直在问 ios 问题,...你有没有尝试过不改变工具栏的框架来改变它的超级视图的框架? 好的,但它是如何工作的?什么是超级视图,我将如何更改它? 将 self.navigationController.frame 换成 self.navigationController.toolbar.frame ?? 好的,我明白了。您的回答并不能完全解决我的问题。我在计算移动工具栏的错误位置时遇到了一些错误。不过感谢您的帮助!【参考方案2】:

我发现新位置的计算不正确。这是我的最终代码 sn-p 在导航控制器视图中使用键盘移动工具栏(只是向上移动部分,添加了视图方向)​​:

- (void) liftMainViewWhenKeybordAppears:(NSNotification*)aNotification

NSDictionary* userInfo = [aNotification userInfo];

NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
CGRect keyboardFrame;
CGFloat keyboardHeight;

[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame];

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];

if (orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown ) 
    keyboardHeight = keyboardFrame.size.height;

else 
    keyboardHeight = keyboardFrame.size.width;


[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:animationDuration];
[UIView setAnimationCurve:animationCurve];

[self.navigationController.toolbar setFrame:CGRectMake(self.navigationController.view.frame.origin.x,
                                                       self.navigationController.view.frame.origin.y + self.navigationController.view.frame.size.height + self.tabBarController.tabBar.frame.size.height - keyboardHeight - self.navigationController.toolbar.frame.size.height,
                                                       self.navigationController.toolbar.frame.size.width,
                                                       self.navigationController.toolbar.frame.size.height)];

[UIView commitAnimations];
NSLog(@"toolbar moved: %f", self.navigationController.view.frame.size.height);

注意:keyboard.size.hight 值高不适应横向视图。

【讨论】:

以上是关于iOS 为啥将 ToolBar 间隙移至键盘的主要内容,如果未能解决你的问题,请参考以下文章

Jquery移动页脚上方的白色间隙

iOS为数字键盘增加完成按钮

iOS-自己定义键盘选择器

IQKeyBoardManager-键盘toolBar出现在屏幕最顶部

为啥切换到 DojoX 网格会导致 JavaScript“无法将焦点移至控制”错误?

为啥在js取消设置只读标签后iOS不显示键盘输入?