31

我有一个自定义的 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 顶部对齐的正确方法是什么?

4

10 回答 10

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;
}
于 2013-10-11T19:22:55.970 回答
51

这是一个 iOS 8 解决方案,但它可以在 iOS 7 上运行:转到情节提要 > 选择表格视图控制器 > 取消选中“底部栏下”。而已!

例子

于 2014-12-02T11:49:05.293 回答
7

contentInset表视图的.bottom值设置为 49 点应该可以纠正此问题。

在正确的配置下,YES在 iOS 7 上调用新的 UIViewController 属性设置automaticallyAdjustsScrollViewInsets应该可以纠正这个问题,但是(再次)它取决于许多其他因素(视图层次结构、父视图控制器的设置等)。

于 2013-10-11T19:27:30.873 回答
6

接受的答案对我来说不太适用——我的设置有点不同。我正在以编程方式创建我的视图控制器。我的应用程序的根是一个选项卡栏控制器,一个选项卡是一个导航控制器,它的根是一个UIViewController以表格视图作为主视图的。

但对我有用的是当我手动计算表格视图的高度并将其设置在框架中时分配初始化表格视图。一般公式为:

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

于 2013-12-03T10:11:56.687 回答
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);
于 2014-03-31T12:05:55.887 回答
2

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

希望有帮助

于 2014-06-12T09:59:29.573 回答
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));
}

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

于 2014-02-19T02:16:08.557 回答
0

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

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGFloat bottomOffset = self.bottomLayoutGuide.length;

    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, bottomOffset, 0);
}
于 2014-09-08T19:08:11.910 回答
0

我认为这对你会更好:

[super viewDidLoad];

试试下面的代码:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;
于 2014-01-19T21:03:30.000 回答
0

尽管更改表格视图的 contentInset 是一个可行的解决方案,但我发现最好确保表格视图在 Tabbar 之前停止。

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

在此处输入图像描述

希望能帮助到你。

于 2014-10-17T07:34:47.877 回答