我想在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在打开时不会正确调整大小,导致部分渲染,以及底部的大灰框(我可以向上滚动)并且与其他内容一起下来,如果这个灰色框不存在则通常适合),如下:
我该怎么办?谢谢你的帮助!
答案 0 :(得分:3)
您应该为约束更改设置动画。您拥有通知用户信息中所需的所有信息(UIKeyboardAnimationCurveUserInfoKey
,UIKeyboardAnimationDurationUserInfoKey
)。
我认为你的第二个问题是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上运行。但由于存在无法解决的错误,这是我们找到的最佳解决方案。