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

Ios 打开时,如何将通常位于UIWebView下方的按钮粘贴到键盘上方?,ios,cocoa,ios6,ios7,Ios,Cocoa,Ios6,Ios7,我想在UIWebView下面添加一个按钮和一些其他视图。当键盘打开时,当键盘升起时,这些视图应平滑地设置动画。UIWebView的大小应平滑调整。我目前有以下情况: 无键盘: 键盘: 看起来它工作得很好,但实际上,这是在调整大小过程中的样子: UIWebView的底部立即向上跳跃,键盘平滑调整大小,底部视图稍微落后 我有以下代码: - (void)registerForKeyboardNotifications { [[NSNotificationCenter defaultCen

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

无键盘:

键盘:

看起来它工作得很好,但实际上,这是在调整大小过程中的样子:

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在打开时无法正确调整大小,从而导致部分渲染,以及底部出现一个大的灰色框(我可以将其与其余内容一起上下滚动,如果此灰色框不存在,则通常适合此内容),如下所示:


我能做什么?谢谢你的帮助

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

我认为,您的第二个问题是
UIWebView
的问题。我也有这个问题。在iOS7中,苹果似乎试图为webview滚动视图设置内容插入,但有时失败得很惨。我最后做了一些卑鄙的把戏来阻止webview这样做

附录

如何使用动画曲线

网络视图技巧

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

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

  • UIWebView
    • 私有
      UIScrollView
      子类
      • 绘制实际内容的专用视图
我们最终选择了私有视图,并将其放在我们自己的滚动视图中,我们可以自己管理它。您需要在私有视图增大或缩小时更新内容大小。我们在
frame
属性上使用键值观察来监听大小的更改。为了获得正确的内容插入,我们使用键盘框架来确定底部内容插入的大小


我必须面对这一点,并说,理想情况下,我们不应该这样做。它容易出错。根据经验,我们知道它可以从iOS5运行到iOS7.1。我不能保证它能在iOS8上工作。但由于存在无法解决的错误,这是我们找到的最佳解决方案。

这是否意味着我应该将
self.bottomConstraint.constant
的更新移动到
animateWithDuration
主体?另外,请详细说明UIWebView的技巧。谢谢嗯,现在我想起来了,你的方法应该足够制作动画了。使用断点检查动画持续时间是否为非零值。我将在编辑中详细阐述我的技巧。在肉眼看来,动画看起来不错。只有当我在中间截屏时,它看起来很奇怪。不好的部分是webview的内容立即跳起,而不是平滑地调整大小。我还保留了实际webview内容下的灰色空间。另一方面,我将动画选项更改为
(uiviewmanimationoptions)[info-objectForKey:uikeyboardanimationcurveueserinfo]
,这导致动画行为非常怪异。我现在要删除这个选项。你不是这样使用它的!我也会编辑相关信息。明白了,谢谢你的帮助!正如你所知道的,我对iOS开发相当陌生。
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
// ... do stuff here
[UIView commitAnimations];