用键盘iOS8移动UIToolbar

Posted

技术标签:

【中文标题】用键盘iOS8移动UIToolbar【英文标题】:Move UIToolbar with keyboard iOS8 【发布时间】:2015-06-16 23:25:19 【问题描述】:

我的 ViewController 底部有一个 UIToolbar,它继承自 self.navigationController。我使用以下代码在 viewWillAppear: 方法中的 ViewController 中显示它:

[self.navigationController setToolbarHidden:NO animated:NO];
self.navigationController.toolbar.backgroundColor = [UIColor blackColor];
self.navigationController.toolbar.tintColor = [UIColor blackColor];
self.navigationController.toolbar.barStyle = UIBarStyleBlackOpaque;

在那之后,我的 ViewControllerprogrammatically 添加了一个 UITextView 和一个 UIButton 允许用户将cmets添加到ViewController,其实就是一个UITableViewController。每当我的 UITextView 开始编辑时,我希望整个 UIToolbar 向上移动到键盘的最顶部。

要做到这一点,我有 A)

-在viewDidLoad: 方法中将以下观察者添加到我的ViewController

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillHide:)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];

和 B)

-添加了以下这些方法来控制navigationController固有的UIToolbar的重新定位。

- (void)keyboardWillShow:(NSNotification *)aNotification

    NSDictionary* keyboardInfo = [aNotification userInfo];
    NSValue* keyboardFrameEnd = [keyboardInfo valueForKey:UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardFrameEndRect = [keyboardFrameEnd CGRectValue];

    // the keyboard is showing so resize the table's height
    NSTimeInterval animationDuration =
    [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    CGRect frame = self.view.frame;  //self.view.frame
    self.navigationController.toolbar = CGRectMake(self.navigationController.toolbar.frame.origin.x,
                                                   self.navigationController.toolbar.frame.origin.y + 10,
                                                   self.navigationController.toolbar.frame.size.width,
                                                   self.navigationController.toolbar.frame.size.height);
    [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
    [UIView setAnimationDuration:animationDuration];
    self.view.frame = frame;
    [UIView commitAnimations];


- (void)keyboardWillHide:(NSNotification *)aNotification

    NSDictionary* keyboardInfo = [aNotification userInfo];
    NSValue* keyboardFrameEnd = [keyboardInfo valueForKey:UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardFrameEndRect = [keyboardFrameEnd CGRectValue];

    // the keyboard is hiding reset the table's height
    NSTimeInterval animationDuration =
    [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    CGRect frame = self.view.frame;
    frame.origin.y += self.navigationController.toolbar.frame.size.height;
    [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
    [UIView setAnimationDuration:animationDuration];
    self.view.frame = frame;
    [UIView commitAnimations];

我已经尝试了各种方法来尝试让它发挥作用,我发现这种方法对于我的应用程序来说是最简单的。我收到一个错误:

Assignment to read-only property

在这一行:

self.navigationController.toolbar = CGRectMake(self.navigationController.toolbar.frame.origin.x,
                                               self.navigationController.toolbar.frame.origin.y + 10,
                                               self.navigationController.toolbar.frame.size.width,
                                               self.navigationController.toolbar.frame.size.height);

keyboardWillShow: 方法中。看来我无法更改 navigationController 固有工具栏的位置,这是否意味着我需要以编程方式创建 UIToolbar?

另外,如果可能的话,我怎样才能简单地让这段代码实现我的目标而不使事情复杂化并制作一个程序工具栏,我宁愿坚持使用固有的工具栏。谢谢。

【问题讨论】:

【参考方案1】:

第一:

self.view 没有工具栏,你必须单独移动你的工具栏..

第二:

self.navigationController.toolbar = CGRectMake..

这是错误的,self.navigationController.toolbar.frame = CGRectMake.. 是正确的方式。

第三:

使用self.navigationController.toolbar.frame.origin.y - keyboardFrame.size.height 我认为您必须根据键盘的高度正确计算self.navigationController.toolbar 的框架,并为其设置动画..

[UIView beginAnimations:@"ResizeForKeyboard" context:nil];
[UIView setAnimationDuration:animationDuration];

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

[UIView commitAnimations];

如果您有自己的工具栏(以编程方式/自定义),另一种选择是使用 UITextFields -inputAccessoryView(如果您正在使用 UITextField)..

【讨论】:

谢谢你这个工作,只是做了一个编辑..它只需要(- YourKeyboardFrame.size.height 嘿,您能否详细介绍一下 KeyboardWillHide 方法中的代码?我有同样的问题,但每次调用 keyboardWillhide 时,我的 self.view 都会下移。 @ilia510,你只需要反转 keyboardWillShow ( + YourKeyboardFrame.size.height ) 中的内容即可。

以上是关于用键盘iOS8移动UIToolbar的主要内容,如果未能解决你的问题,请参考以下文章

ios8中的键盘高度不同

iOS8 自定义键盘问题

iOS 8 出现键盘时 UIView 上移 |问题

在 UITextView 上以编程方式禁用 iOS8 Quicktype 键盘

iOS8--改变方向后键盘消失

Swift/iOS8:只允许某些键盘