工具栏在多任务处理时动画

时间:2017-02-09 00:35:25

标签: ios objective-c webview uitoolbar

所以经过google和SO的长时间搜索后,我没有发现类似的问题。有些人接近但不像我的。

手头的问题: 在我的应用程序(基于WKWebView)中,如果显示键盘,我双击主页并切换到显示键盘的另一个应用程序,我的应用程序键盘被隐藏。这不是问题。因此,当我再次执行多任务时,在我的应用程序的快照中,键盘消失了,但我上面的自定义工具栏似乎保持不变,下面没有键盘。我点击我的应用程序,它会动画,然后返回到屏幕底部。

我尝试过的: 我知道[self.view endEditing:YES],resigningFirstResponder以及关闭键盘的所有方法。尝试通过viewWillDisappear,applicationWillResignActive和applicationDidEnterBackground进行放置和混合。这些都不会处理我的工具栏问题。

这就是我在屏幕上和屏幕外设置键盘动画的方式,同时保持工具栏可见。

    - (void)keyboardWillShow:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    NSNumber *durationValue = info[UIKeyboardAnimationDurationUserInfoKey];
    NSNumber *curveValue = info[UIKeyboardAnimationCurveUserInfoKey];
    NSValue *endFrame = info[UIKeyboardFrameEndUserInfoKey];

    [UIView animateWithDuration:durationValue.doubleValue
                          delay:0
                        options:(curveValue.intValue << 16)
                     animations:^{
                         self.toolBar.frame = CGRectMake(0,
                                                         [endFrame CGRectValue].origin.y - self.toolBar.bounds.size.height+44,
                                                         self.toolBar.bounds.size.width,
                                                         self.toolBar.bounds.size.height);
                     }
                     completion:nil];
}

- (void)keyboardWillHide:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    NSNumber *durationValue = info[UIKeyboardAnimationDurationUserInfoKey];
    NSNumber *curveValue = info[UIKeyboardAnimationCurveUserInfoKey];
    NSValue *endFrame = info[UIKeyboardFrameEndUserInfoKey];

    [UIView animateWithDuration:durationValue.doubleValue
                          delay:0
                        options:(curveValue.intValue << 16)
                     animations:^{
                         self.toolBar.frame = CGRectMake(0,
                                                         [endFrame CGRectValue].origin.y - self.toolBar.bounds.size.height,
                                                         self.toolBar.bounds.size.width,
                                                         self.toolBar.bounds.size.height);
                     }
                     completion:nil];
}

有人有线索或想法吗?

我的应用程序再次基于WKWebView,因此直接调用或指向textview,尝试将重点放在webview上是毫无意义的。

如果有人需要更多代码,请告诉我。 任何帮助,将不胜感激。谢谢。

更新1/20/18

所以这里是请求的代码,该代码与我的工具栏的初始化和加载位置和方式有关。

小时。

UIToolbar *toolBar;
@property (nonatomic, strong) UIToolbar *toolBar;

米。

@synthesize toolBar;

- (void)viewDidLoad {
    //Toolbar setup
    CGRect toolFrame, remain;
    CGRectDivide(self.view.bounds, &toolFrame, &remain, 48, CGRectMaxYEdge);
    self.toolBar = [[UIToolbar alloc] initWithFrame:toolFrame];
    [self.toolBar setBarStyle:UIBarStyleBlackTranslucent];
    [self.toolBar setClipsToBounds:YES];
    [self.toolBar setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin];
    [self.view addSubview:self.toolBar];
}

就是这样,除了一些代码在我切换按钮时调用它来刷新它,没有别的东西与这个工具栏绑定。

除非我点击一个开关或需要在用户更改背景时刷新它,否则不会调用它,在另一个视图中处理NSUserDefaults。

-(void)viewWillLayoutSubviews{
    [self.currentScrollView layoutIfNeeded];
    [self.toolBar layoutIfNeeded];
    [self.view layoutSubviews];
}

1 个答案:

答案 0 :(得分:0)

以下是对我有用的内容。

在我的AppDelegate.m中,我只需输入endEditing:

- (void)applicationWillResignActive:(UIApplication *)application {
    [self.window endEditing:YES];
}

现在在我的keyboardWillShow通知中:

    - (void)keyboardWillShow:(NSNotification*)notification
{
    /////New added method//////
    if([UIApplication sharedApplication].applicationState != UIApplicationStateActive){
        return;
    }


    NSDictionary* info = [notification userInfo];
    NSNumber *durationValue = info[UIKeyboardAnimationDurationUserInfoKey];
    NSNumber *curveValue = info[UIKeyboardAnimationCurveUserInfoKey];
    NSValue *endFrame = info[UIKeyboardFrameEndUserInfoKey];

    [UIView animateWithDuration:durationValue.doubleValue
                          delay:0
                        options:(curveValue.integerValue << 16)
                     animations:^{
                         self.toolBar.frame = CGRectMake(0,
                                                         [endFrame CGRectValue].origin.y - self.toolBar.bounds.size.height+44,
                                                         self.toolBar.bounds.size.width,
                                                         self.toolBar.bounds.size.height);
                     }
                     completion:nil];    
}

就是这样,毕竟这么简单。只是隐藏键盘,就像我之前做的那样,并检查应用程序是否处于活动状态。

现在,当我双击家中时,键盘会隐藏。如果我转到另一个应用程序,如消息,绘制键盘,再次双击并返回到我的应用程序,键盘永远不会移动。解决我的问题。