iPhone X横屏下全屏的UICollectionViewCell问题

5
在我的应用程序中,我以模态方式呈现一个视图控制器,这个视图控制器包含一个填充superview的UICollectionView。集合视图中的每个单元格都需要全屏显示-与视图边界相同的大小。为了实现这一点,我只需在viewDidLayoutSubviews中将UICollectionViewFlowLayout的itemSize设置为视图边界的大小即可。
这在所有设备和方向上都非常有效,除了iPhone X横向。在这种情况下呈现该屏幕时,似乎安全区域布局边距正在发挥作用并影响单元格的定位。单元格从显示屏左侧推出,并向上推动,使单元格的底部与主指示器的垂直中心对齐。使用View Debugger检查布局会显示集合视图填满了屏幕,但是单元格的Y位置为-10.67,X位置为0,尽管它从集合视图的前导处插入。值得注意的是,这在控制台中被记录下来:
The behavior of the UICollectionViewFlowLayout is not defined because:
the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values.
The relevant UICollectionViewFlowLayout instance is <UICollectionViewFlowLayout: 0x7fa6311253b0>, and it is attached to <UICollectionView: 0x7fa63207e800; frame = (0 0; 812 375); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x608000244d70>; layer = <CALayer: 0x60800023ef00>; contentOffset: {-44, 0}; contentSize: {0, 812}; adjustedContentInset: {0, 44, 21, 44}> collection view layout: <UICollectionViewFlowLayout: 0x7fa6311253b0>.

这里发生了什么事情,如何解决?

只是好奇,为什么不在 collectionView(_:layout:sizeForItemAt:) 中设置 itemSize 而不是在 viewDidLayoutSubviews 中设置? - dispatchswift
另外,如果使用第一个提到的设置itemSize,请确保使用view.frame来设置宽度和高度,而不是view.bounds - dispatchswift
1个回答

28

默认情况下,iOS 11会自动调整iPhone X横向内容插图,导致此问题发生。要解决此问题,您可以简单地禁用自动内容插图调整,因为在此情况下不需要也不希望出现。

collectionView.contentInsetAdjustmentBehavior = .never


完美地工作了!我曾试图使用UICollectionViewFlowLayoutSectionInsetReference来关闭它,但似乎那样做会产生其他影响。 - sahandnayebaziz
1
嗨,我已经在 didSet 观察器中将此行为添加到我的集合中,并且我正在像 return self.view.frame.size 这样在 collectionView(_:layout:sizeForItemAt:) 中设置单元格大小,但是仅对于 iPhone X 的横向模式仍然存在问题。是否还有其他需要检查的地方? - Jose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接