我花了很长时间来解决这个问题,试图在表格视图的底部放置一个响应按钮。我没有使用自动布局。我发现 iOS 6 和 7 之间的两个主要区别:
在 iOS7 上,当 tab bar 动画出来时,根视图控制器的视图不会延伸到 tab bar 所在的区域;它需要调整大小。
在 iOS7 上,只有 UITabBar 类型的视图需要在屏幕上进行动画关闭和显示。
第 1 点的另一个问题是,如果在 iOS7 中,您将可见视图控制器主视图的子视图扩展到选项卡视图留下的空间,除非主视图被扩展,否则它将无法交互也是。考虑到这一点,我使用了以下代码:
隐藏标签栏(将数学反转显示):
[UIView animateWithDuration:kHideTabBarAnimationDuration animations:^{
for(UIView *view in self.tabBarController.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y + view.frame.size.height, view.frame.size.width, view.frame.size.height)];
}
else
{
if (![MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height + self.tabBarController.tabBar.frame.size.height)];
}
}
}
} completion:nil];
隐藏标签栏时调整主视图:
// Expand view into the tab bar space
if ([MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
{
CGRect frame = self.view.frame;
self.view.frame = CGRectMake(frame.origin.x,
frame.origin.y,
frame.size.width,
frame.size.height + tabBarHeight);
}
调整显示标签栏时的主视图:
[UIView animateWithDuration:kHideTabBarAnimationDuration delay:0.0f options:UIViewAnimationOptionCurveEaseIn animations:^{
// Create space for the tab bar
if ([MYDeviceUtility systemVersionGreaterThanOrEqualTo:@"7.0"])
{
CGRect frame = self.view.frame;
self.view.frame = CGRectMake(frame.origin.x,
frame.origin.y,
frame.size.width,
frame.size.height - tabBarHeight);
}
} completion:nil];
请注意,当隐藏标签栏时,我不会为主视图展开动画,这看起来很自然,因为展开发生在标签栏后面。
另请注意
在 iOS 7 中,如果在标签栏隐藏的情况下从纵向旋转到横向,黑框会重新出现。我通过在旋转动画之前将标签栏动画化回到屏幕上解决了这个问题(这对于我正在处理的工作来说已经足够了)。