我有一个自定义的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顶部对齐的正确方法是什么?
答案 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"。那就是它!
答案 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的一个例子,但它也可以在代码中完成。
希望它有所帮助。