在 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 中使用标签栏控制器时,集合视图的高度计算错误的主要内容,如果未能解决你的问题,请参考以下文章