如何在打开时粘贴键盘上方通常位于UIWebView下方的按钮?

时间:2013-11-22 21:00:51

标签: ios cocoa ios6 ios7

我想在UIWebView下面添加一个按钮和一些其他视图。当键盘打开时,这些视图应该在键盘上升时平滑地动画起来。 UIWebView应该平滑地调整大小。我目前有以下内容:

没有键盘:

no_keyboard

键盘:

keyboard

看起来它工作正常,但实际上,这就是调整大小时的样子:

during_resizing

UIWebView的底部立即跳起,键盘平滑调整,底部视图略微落后。

我有以下代码:

- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(handleKeyboardWillChangeFrameNotification:)
                                                 name:UIKeyboardWillChangeFrameNotification object:nil];
}

- (void)handleKeyboardWillChangeFrameNotification:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    if (!self.is_keyboard_open) {
        self.bottom_constraint_constant = self.bottomConstraint.constant;
        self.bottomConstraint.constant = kbSize.height + self.bottomConstraint.constant;
    } else {
        self.bottomConstraint.constant = self.bottom_constraint_constant;
    }

    [UIView animateWithDuration:animationDuration animations:^{
        [self.view layoutIfNeeded];
    }];

    self.is_keyboard_open = !self.is_keyboard_open;
}

底部约束是文本和屏幕底部之间的约束。

我遇到的另一个问题是,当键盘被多次切换时,UIWebView在打开时不会正确调整大小,导致部分渲染,以及底部的大灰框(我可以向上滚动)并且与其他内容一起下来,如果这个灰色框不存在则通常适合),如下:

weird_bug

我该怎么办?谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

您应该为约束更改设置动画。您拥有通知用户信息中所需的所有信息(UIKeyboardAnimationCurveUserInfoKeyUIKeyboardAnimationDurationUserInfoKey)。

我认为你的第二个问题是UIWebView的问题。我也遇到过这个问题。在iOS7中,Apple似乎尝试为webview滚动视图设置内容插入,但有时它会失败。我最终做了一些讨厌的技巧来阻止webview这样做。

<强>附录

如何使用动画曲线

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
// ... do stuff here
[UIView commitAnimations];

Webview技巧

我们的webview使用更加复杂,因为我们使用contentEditable=YES来编辑HTML内容。我们所做的是完全控制内部webview子视图。

通常,UIWebView的视图层次结构为:

  • UIWebView
    • 私有UIScrollView子类
      • 绘制实际内容的私人视图

我们最终获取私人视图并将其放入我们自己可以管理的滚动视图中。私有视图增长或缩小时,您需要更新内容大小。我们在frame属性上使用键值观察来监听大小的变化。为了获得正确的内容插入,我们使用键盘框来确定底部内容插入的数量。

我必须在此发帖,并说理想情况下,我们不应该这样做。这很容易出错。根据经验,我们知道它适用于iOS5到iOS7.1。我不能保证它会在iOS8上运行。但由于存在无法解决的错误,这是我们找到的最佳解决方案。