Tab Bar涵盖iOS7中的TableView单元格

时间:2013-10-11 19:20:43

标签: objective-c uitabbarcontroller ios7 uitableview

我有一个自定义的tableViewController,我将其添加到带有

的TabBarController中
self.tabBarController.viewControllers = [NSArray arrayWithObjects:someOtherViewController, customTableViewController, nil];
self.tabBarController.selectedIndex = 1;

我遇到的问题是,运行iOS7的iPhone 4屏幕底部的标签栏覆盖了最后1.5个tableViewCells。当我使用iOS模拟器 - iPhone Retina(4英寸)/ iOS 7.0时,问题仍然存在。

在不使用“魔术数字”的情况下,使tableView与屏幕底部tabBar顶部对齐的正确方法是什么?

10 个答案:

答案 0 :(得分:77)

尝试使用CustomViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIEdgeInsets adjustForTabbarInsets = UIEdgeInsetsMake(0, 0, CGRectGetHeight(self.tabBarController.tabBar.frame), 0);
    self.scrollView.contentInset = adjustForTabbarInsets;
    self.scrollView.scrollIndicatorInsets = adjustForTabbarInsets;
}

答案 1 :(得分:50)

它是iOS 8解决方案,但它可以在iOS 7上运行:转到故事板>选择表视图控制器>取消选中" Under Bottom Bars"。那就是它!

example

答案 2 :(得分:7)

设置表格视图contentInset的{​​{1}}值为49分应该可以解决这个问题。

在正确的配置下,为名为.bottom的iOS 7上的新UIViewController属性设置YES应该更正此问题,但(再次)它取决于许多其他因素(视图层次结构,父视图)控制器的设置,等等。

答案 3 :(得分:6)

接受的答案对我来说并不适用 - 我的设置有点不同。我是以编程方式创建我的视图控制器。我的应用程序的根是一个标签栏控制器,一个标签是一个导航控制器,其根是UIViewController,以表视图作为主视图。

对我来说有用的是当我手动计算表视图的高度并在alloc-initing table视图时将其设置在框架中。通用公式为:

  

屏幕高度 - (状态栏高度+导航栏高度+标签栏高度)

答案 4 :(得分:5)

CGFloat bottom =  self.tabBarController.tabBar.frame.size.height;
NSLog(@"%f",bottom);
[self.tableview setScrollIndicatorInsets:UIEdgeInsetsMake(0, 0, bottom, 0)];
self.tableview.contentInset = UIEdgeInsetsMake(0, 0, bottom, 0);

答案 5 :(得分:2)

将您的表格控制器嵌入导航控制器中。 1.选择故事板中的视图。 2.在菜单栏上选择编辑器 - >嵌入 - >导航控制器。

希望有所帮助

答案 6 :(得分:1)

我有一个与Matt Quiros类似的视图层次结构:UITabBarController - > UINavigationController - > UIViewController - > UITableViewController(嵌入为UIViewController的子视图)。其他答案在我的情况下不起作用,我不得不在表视图控制器的viewWillAppear:方法中手动设置表视图的框架。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Adjust height of tableview (does not resize correctly in iOS 7)
    CGRect tableViewFrame = self.tableView.frame;
    tableViewFrame.size.height = [self heightForTableView];
    self.tableView.frame = tableViewFrame;
}

- (CGFloat)heightForTableView
{
    return CGRectGetHeight([[UIScreen mainScreen] bounds]) -
           (CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]) +
            CGRectGetHeight(self.navigationController.navigationBar.frame) +
            CGRectGetHeight(self.tabBarController.tabBar.frame));
}

如果有人找到更好的解决方案,请分享!

答案 7 :(得分:0)

我认为这对你更有效:

[super viewDidLoad];之后

尝试以下代码:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

答案 8 :(得分:0)

您还可以实施viewDidLayoutSubviews并使用bottomLayoutGuide来获取标签栏的高度:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGFloat bottomOffset = self.bottomLayoutGuide.length;

    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, bottomOffset, 0);
}

答案 9 :(得分:0)

即使更改表View的contentInset是一个有效的解决方案,我发现最好确保表视图在Tabbar之前停止。

正如Paul Newman所说,使用bottomLayoutGuide是一件好事,特别是如果你使用autolayout。 在我的情况下,在链接到BottomLayoutGuide顶部的tableview底部添加一个约束是一个干净的解决方案,这是Storyboard的一个例子,但它也可以在代码中完成。

enter image description here

希望它有所帮助。