【问题标题】:Tab Bar covers TableView cells in iOS7标签栏覆盖 iOS7 中的 TableView 单元格
【发布时间】:2026-01-23 05:30:01
【问题描述】:

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

【问题讨论】:

  • 我建议你创建 UIViewcontroller 的 View-controller 子类并添加 Tableview IBOutlate。通过 xib 或 storyBoard 并将创建的 viewController 添加到标签栏控制器
  • 这正是现在的设置

标签: objective-c uitabbarcontroller ios7 uitableview


【解决方案1】:

为您的 CustomViewController 试试这个:

- (void)viewDidLoad
{
    [super viewDidLoad];

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

【讨论】:

  • 我已经尝试过了,它似乎提高了表格视图的界限,但仍然覆盖了大约一半的表格视图单元格。
  • 不,不,它是 contentInset。这实际上是一个 UIScrollView 属性,并且由于 UITableView 是 UIScrollView 的子类,因此您应该始终能够编辑它的 contentInset
  • @Zenox 无意伤害你的大脑,所以我更新了我的答案:)
  • 像魅力一样工作!只需复制粘贴即可。
  • 这很好,但滚动条仍然消失在标签栏后面...我没有抱怨,但为什么会发生这种情况?
【解决方案2】:

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

【讨论】:

  • 对我来说适用于 iOS 7 和 8,我认为这是更优雅的答案。
  • 对于功能来说,它是更优雅的答案......但同时它使 tabBar 的背景变灰......这不是我想要的。
  • 它是灰色的,因为你有 tabBar 半透明
  • 也适用于IOS11
【解决方案3】:

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

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

希望对你有帮助。

【讨论】:

    【解决方案4】:

    也可以实现viewDidLayoutSubviews,使用bottomLayoutGuide获取标签栏的高度:

    - (void)viewDidLayoutSubviews
    {
        [super viewDidLayoutSubviews];
    
        CGFloat bottomOffset = self.bottomLayoutGuide.length;
    
        self.tableView.contentInset = UIEdgeInsetsMake(0, 0, bottomOffset, 0);
    }
    

    【讨论】:

      【解决方案5】:

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

      希望有帮助

      【讨论】:

        【解决方案6】:
        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);
        

        【讨论】:

          【解决方案7】:

          我认为这对你来说会更好:

          [super viewDidLoad];之后

          试试下面的代码:

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

          【讨论】:

            【解决方案8】:

            我的视图层次结构与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));
            }
            

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

            【讨论】:

              【解决方案9】:

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

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

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

              【讨论】:

              • 我与 Matt 有相同的设置,不知何故这仍然适用于 iOS 9+
              【解决方案10】:

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

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

              【讨论】:

              • 根据Apple's Documentation,没有自动调整内容设置属性
              • 我是automaticallyAdjustsScrollViewInsets,很抱歉。