当UITabBar存在时,如何正确设置键盘顶部的视图动画?

时间:2014-01-16 11:11:02

标签: ios7 autolayout uitabbar uikeyboard

this answer中详述的关于如何正确设置视图动画(如注释输入框)以保持在键盘顶部的技术,因为它可以很好地进行动画制作。使用键盘动画的曲线和持续时间,在视图底部和底部布局指南之间设置垂直高度约束,并将其设置为键盘框架的高度。

但是当你使用UITabBarController并且屏幕底部有一个标签栏时,这不起作用 - 你的视图与键盘之间的高度差距最大,{...}}由于底部布局指南仍位于标签栏的顶部,但键盘覆盖标签栏,其框架的高度从屏幕底部计算。

简单地从键盘框架高度减去标签栏高度不起作用,因为这会影响动画。您可以在iOS 7上的iPhone Facebook应用程序中清楚地看到此效果;当您关闭键盘时,注释框和键盘之间存在间隙:

Note gap between bottom of comment entry box and tab bar as keyboard animates away

(尝试在iPhone Facebook应用程序的帖子上调用和解除键盘以自行查看动画效果。)

我可以想出几种方法来解决这个问题,我想知道是否有人尝试过这些或有更好的想法:

1)隐藏UITabBar,底部布局指南最终位于屏幕底部(如何?),然后键盘动画显示并在键盘动画显示之前再次显示

2)调整动画曲线/时间,使我的视图与键盘“保持同步”(最好不要猜测/黑客攻击)

3)将视图的底部约束附加到底部布局指南以外的内容(什么?)

1 个答案:

答案 0 :(得分:1)

我一直在为此感到困惑,我找到了一个解决方案,它可能不太优雅,但确定

在您结束编辑并因此开始隐藏键盘的方法中,您可以使用调用此方法的NSTimer scheduledTimerWithTimeInterval:0.05开始:

在调用NSTimer

之前设置
// define these once
textViewHeight = self.textView.frame.size.height;
tabBarHeight = self.tabBar.frame.size.height;
maxOrigin = self.view.frame.size.height - textViewHeight - tabBarHeight;

NSTimer

调用
CGFloat currentOrigin = self.textView.frame.origin.y;

if (currentOrigin > maxOrigin)
{
    CGRect f = self.textView.frame;
    f.origin.y = maxOrigin;
    [self.textView setFrame:f];

    [timer invalidate];
    timer = nil;
}

通过这种方式,动画继续将其设置为已经存在的位置,并且视图保持在键盘上,直到它到达`maxOrigin'在y轴上