2013-10-11 137 views
30

我有我添加到一个TabBarController与标签栏覆盖的TableView细胞iOS7

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

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

是什么使的tableView线向上与在屏幕的底部的TabBar的顶部,而无需使用“幻数”的正确方法?

+0

我建议你创造的UIViewController视图控制器子类,并添加泰伯维IBOutlate。通过xib或storyBoard,并添加该创建viewController到tabbar控制器 –

+0

这正是现在的设置 – JuJoDi

回答

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

我已经试过了,它似乎提高了tableview绑定,但仍然约覆盖一半的表视图单元格。 – JuJoDi

+0

查看已更新的答案 – dariaa

+0

不,不,它是contentInset。这实际上是一个UIScrollView属性,因为UITableView是UIScrollView的一个子类,所以你应该始终能够编辑它的contentInset – dariaa

6

设置你的表视图的contentInset与49点.bottom值应该纠正。

在适当的配置,在iOS 7的新的UIViewController属性设置YES称为automaticallyAdjustsScrollViewInsets应该纠正这一点,但(再次)它取决于很多其他因素(视图层次,父视图控制器的设置,等等)。

+0

根据[Apple的文档](https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html),没有像automaticallyAdjustsContentInsets属性那样的东西 – JuJoDi

+1

它是'自动调整ScrollViewInsets' , 我很抱歉。 – jaredsinclair

6

接受的答案不适合我 - 我的设置有点不同。我正在编程创建我的视图控制器。我的应用程序的根是一个标签栏控制器,一个选项卡是一个导航控制器,其根是一个UIViewController与表视图作为主视图。

什么虽然我工作原理是当我手动计算表视图的高度,并将其设置在框架时ALLOC-INITING表视图。一般的计算公式为:

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

+0

我与马特有相同的设置,不知何故,这仍然适用于iOS 9+ – jaytrixz

0

我认为这将更好地为您:

[super viewDidLoad];

试试下面的代码:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
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)); 
} 

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

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); 
2

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

希望帮助

0

您还可以实现viewDidLayoutSubviews和使用bottomLayoutGuide获得标签栏的高度:

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    CGFloat bottomOffset = self.bottomLayoutGuide.length; 

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

即使改变你的表视图的contentInset是一个可行的解决方案,我最好确保你的表格视图在Tabbar之前停下来。

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

enter image description here

希望它能帮助。

47

这是一个iOS 8的解决方案,但它可能在iOS 7上工作:去故事版>选择表视图控制器>取消选中“底部酒吧”。而已!

example

+1

在iOS 7和8对我来说,我认为这是更优雅的答案。 – Simon

+12

对于功能而言,它是更优雅的答案......但同时它使tabBar灰色的背景......这不是我想要的。 – Simon

+3

它是灰色的,因为你有tabBar半透明 – alessioarsuffi