在 iOS 10 中使用标签栏控制器时,集合视图的高度计算错误

Posted

技术标签:

【中文标题】在 iOS 10 中使用标签栏控制器时,集合视图的高度计算错误【英文标题】:Height of the collection view is getting calculated wrongly while using tabbar controller in iOS 10 【发布时间】:2018-04-04 16:22:09 【问题描述】:

我创建了一个标签栏控制器,其中包含一个带有容器视图的示例视图控制器。该容器嵌入了引用的StoryBoard。

参考故事板包含一个视图控制器,其中嵌入了 collectionView 控制器。

当我的应用程序运行时,collectionView 单元格高度计算错误。集合视图单元格隐藏在顶部。

注意: 1)集合视图滚动方向是水平的。在垂直方面它的工作良好

2) 当我不使用 tabBar 时,collectionView 单元格高度计算正确。

您可以在此链接中找到示例项目:https://drive.google.com/open?id=1GbKC_ZhqQAlcLnD24YgxQTZt2toVprwF

这个问题在 ios11 中运行良好。

【问题讨论】:

我通过在 viewDidAppear 中重新加载集合视图进行了临时修复,但这只是一个 hack 我检查过,问题发生在设备旋转后。对吗? @trungduc,不。旋转已锁定在我的设备中 我的答案怎么样? 您是否尝试过自动布局将 childView 约束到其父级? 【参考方案1】:

问题(在我看来):

在启动时SampleCollectionViewController 以正常大小(可能是全屏大小)创建。此时,collectionView 被创建并重新加载。 collectionViewCell 的大小是根据 SampleCollectionViewController 的大小计算的。 但在那之后,SampleCollectionViewController 被嵌入到另一个尺寸更小的控制器中。 SampleCollectionViewController 的大小发生变化,但 collectionView 未重新加载,collectionViewCell 保持启动大小。 现在collectionViewCell 的高度大于屏幕上SampleCollectionViewController 的大小。这就是隐藏单元格顶部的原因。

解决方案:在traitCollectionDidChange: 方法中调用invalidateLayout。这意味着当SampleCollectionViewController的大小发生变化时,计算单元格大小并更新正确大小的单元格。

SampleCollectionViewController.m

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection 
  [super traitCollectionDidChange:previousTraitCollection];

  [self.collectionView.collectionViewLayout invalidateLayout];

Project works normally on my side.

【讨论】:

嗨 trungduc,我试过这段代码,但问题仍然存在。我认为问题出在容器视图+标签栏控制器上。您能否解释一下为什么我们需要在 traitCollectionDidChange 中使布局无效。需要调整时不会产生问题 在 SampleCollectionViewController 添加 [self.collectionView reloadData];这将向您展示输出的差异,并感谢您提供建议 抱歉,您能展示一下您的输出吗?如果我取消注释 [self.collectionView reloadData];,我看不出有什么区别 您可以从以下链接中找到预期和实际输出,drive.google.com/open?id=1pi7Q-hKiCUQd5E8ibHTyHH4irnnFvyGj 您在我的回答中尝试过项目吗?运行这个项目,你会看到预期的输出drive.google.com/file/d/10GCUZ87VpPw8owJ6UT_MgvE9d0lpb6Sr/view【参考方案2】:

在情节提要中选择您的视图控制器。检查是否选择了调整滚动视图插图,然后取消选择它。这就是我解决问题的方法。

【讨论】:

嗨@Jagjot Singh 就我而言,它不起作用。感谢您的建议【参考方案3】:

当我更改设计时,我能够为 iOS 10 解决这个问题。在 iOS 11 上也能正常工作。

我创建了一个 segue 来调用情节提要参考,而不是用于情节提要参考的容器视图。由于问题特定于 iOS 10 和水平集合视图,我将继续问题中提到的早期设计。

【讨论】:

以上是关于在 iOS 10 中使用标签栏控制器时,集合视图的高度计算错误的主要内容,如果未能解决你的问题,请参考以下文章

如何知道我之前在 iOS 中的标签栏视图控制器是哪个?

使用标签栏控制器离开视图时如何关闭视图

iOS UI 元素在标签栏控制器中来回切换后被拉伸

使用标签栏从另一个视图返回时如何重新加载视图控制器

如何在swift ios中刷新标签栏项目

iOS MapView 位于导航栏、状态栏和标签栏控制器下