2

在过去的十年中,我制作了数百个表视图控制器,但我不知道为什么会这样。my 的内容UITableView卡在 my 中的 my UINavigationBar(带有背景颜色)下UINavigationController。我在现有项目中遇到了这个问题,但为了找出问题,我创建了一个全新的项目,其中没有任何其他内容。

  • 我创建了一个项目。
  • 创建了仅添加一些示例部分/行的 TestTableViewController 类。
  • 从情节提要中删除了初始视图控制器。
  • 添加了一个 UITableViewController 并将其类类型设置为 TestTableViewController。
  • 将 UITableView 的背景颜色设置为 UIColor.systemGroupedBackgroundColor。
  • 将 UITableViewCell 更改为 Basic 类型,并将其单元重用 id 设置为“Cell”。
  • 告诉故事板将 TestTableViewController 嵌入 UINavigationController。
  • 将该 UINavigationController 设置为初始视图控制器。

当我启动应用程序时,导航栏被隐藏(我相信是由于scrollEdgeAppearance),当我开始从顶部边缘滚动时,导航栏开始显示。

但我需要导航栏上的背景颜色,所以:

  • 在情节提要中,我将 UINavigationController 的导航栏更改为背景色。

现在 UITableView 内容卡在导航栏下。

我尝试在我的应用程序委托中配置 UINavBar 的外观:

// in AppDelegate -didFinishLaunchingWithOptions
if (@available(iOS 15.0, *)) {
    UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
    [appearance configureWithOpaqueBackground];
    appearance.backgroundColor = [UIColor systemRedColor];
    
    UINavigationBar.appearance.standardAppearance = appearance;
    UINavigationBar.appearance.compactAppearance = appearance;
    UINavigationBar.appearance.scrollEdgeAppearance = appearance;
    UINavigationBar.appearance.compactScrollEdgeAppearance = appearance;
    
}

但这并没有改变什么。下一个:

  • 我尝试创建一个UINavigationController被调用的子类TestNavController
  • 更新了故事板以将导航上的类设置为TestNavController
  • 向导航栏添加代码-awakeFromNib并显式设置样式:-viewDidLoad
// TestNavController, -awakeFromNib
if (@available(iOS 15.0, *)) {
    UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
    [appearance configureWithOpaqueBackground];
    appearance.backgroundColor = [UIColor systemBlueColor];
    
    self.navigationBar.standardAppearance = appearance;
    self.navigationBar.compactAppearance = appearance;
    self.navigationBar.scrollEdgeAppearance = appearance;
    self.navigationBar.compactScrollEdgeAppearance = appearance;
}

内容仍然停留在导航栏下。接下来,我尝试将故事板排除在等式之外,SceneDelegate.m然后-scene:willConnectToSession:options将故事板创建的根视图控制器替换为完全基于代码的根视图控制器:

TestTableViewController *testvc = [[TestTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
testvc.view.backgroundColor = UIColor.systemGroupedBackgroundColor;
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:testvc];
self.window.rootViewController = nav;

它完全按预期工作!那么,为什么我的故事板配置的视图控制器和代码库外观设置显示错误,而基于代码的视图控制器看起来像预期的那样?我一直在不同的位置使用不同的颜色,以便我可以分辨出哪个代码具有效果。在 App Delegate 中设置红色,在 NavigationItem 上的 TestTableViewController 的 awakeFromNib 中设置蓝色。

故事板版本和代码版本的并排屏幕截图

我认为这是 scrollEdgeAppearance 的问题,但我尝试通过代码设置它,但似乎没有任何效果。

当我使用故事板时,为什么我的内容卡在导航栏下?我错过了什么?

这是下载项目的链接: https ://inadaydevelopment.com/stackoverflow/wtf.zip

4

2 回答 2

1

很难说这是否是故事板中的错误。可能是这样,您可能应该将其包装成一个更好的示例并将其与错误报告一起发送给 Apple。您应该提供两个项目,一个在代码中完成所有事情,另一个在情节提要中尽可能多地完成。

我可以告诉你的一件事是,我没有看到 Apple 使用带有零节标题的分组样式表。(设置应用程序是查看的好地方。)如果您通过将标题设置为 nil 来抑制您的第零节标题,则看起来很好,因为没有标题文本卡在导航栏下方。

如果您要在使用分组样式时给零部分一个标题,您可能希望通过给表格部分标题一些填充来补偿。这将使其远离导航栏下方。但是,在进行了一些其他更改后,我最终得到了零填充。

我注意到的另一个问题是页脚高度似乎很重要。通过故意将页脚高度设置为 1(它不会让我将其设置为零),我从基于情节提要的项目中得到了更好的外观。最后我把它设置为10。

另外,我认为您应该将页眉和页脚的估计高度设置为 0,而不是将它们留在自动。

通过在我自己的项目中使用所有这些参数,我能够得到这个,这在我看来很像您的基于代码的示例(除了我将单元格设为黄色以便清楚地看到它们在哪里):

在此处输入图像描述

这是我最终得到的尺寸设置(但你应该更多地调整它们,直到你满意为止):

在此处输入图像描述

那就是

self.tableView.sectionHeaderTopPadding = 0;
于 2022-01-23T22:03:04.527 回答
0

这可能会有所帮助...

我查看了您的项目并进行了一项更改。

Storyboard 中的表格视图具有以下设置:

在此处输入图像描述

当我运行应用程序时,我得到了这个:

在此处输入图像描述

将部分页眉高度和页脚高度更改为Automatic

在此处输入图像描述

我明白了:

在此处输入图像描述

我从头开始创建了两个项目 - 一个从 Storyboard 加载控制器,一个仅通过代码加载 - 并将所有内容打包到 GitHub 存储库中:https ://github.com/DonMag/wtfTable

运行wtfSBorwtfNoSB给我几乎相同的结果(除了默认的表格背景颜色和节标题高度的细微差别):

在此处输入图像描述

于 2022-01-24T22:27:13.090 回答