全屏水平滚动 UICollectionView 单元格在第一个显示的 UIViewController 中使用时向下移动

Full screen horizontally scrolling UICollectionView cells shift downwards when used in first displayed UIViewController

我正在创建一系列帮助页面,这些页面会在用户首次启动应用程序时显示。为此,我有一个以编程方式设置的 UIViewController,它初始化一个(以编程方式设置的)UICollectionView 视图控制器边界的大小。每个单元格都包含一个全屏大小的图像。

在已有视图控制器的情况下推送此视图控制器时,它显示正常。但是,当此视图控制器用作应用程序导航控制器的初始根视图控制器时,集合视图具有正确的大小和对齐方式,但单元格从屏幕顶部向下移动了大约 10 个像素,因此集合视图查看背景显示。

(注意红色是集合视图背景色)

如果我在 viewDidLoad、viewDidLayoutSubviews 或 viewWillAppear 中设置集合视图,我会遇到同样的问题。如果我在 viewDidAppear 中设置集合视图,我不会遇到这个问题,但这不起作用,因为用户会在加载集合视图之前看到黑屏。

这是显示视图控制器的代码,在 application:didFinishLaunchingWithOptions:launchOptions:

UIViewController* viewControllerToPush = [[OnboardingViewController alloc] initWithNibName:nil bundle:nil];
_nav = [[UINavigationController alloc] initWithRootViewController:viewControllerToPush];
[_nav setNavigationBarHidden:YES];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window setRootViewController:_nav];
[self.window makeKeyAndVisible];

下面是设置集合视图和布局的代码:

UICollectionViewFlowLayout* layout = [[UICollectionViewFlowLayout alloc] init];
layout.minimumInteritemSpacing = 0;
layout.minimumLineSpacing = 0;
layout.itemSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height);
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;

CGRect collectionViewFrame = self.view.bounds;
_collectionView = [[UICollectionView alloc] initWithFrame:collectionViewFrame collectionViewLayout:layout];
_collectionView.delegate = self;
_collectionView.dataSource = self;
_collectionView.pagingEnabled = YES;
_collectionView.showsHorizontalScrollIndicator = NO;

[_collectionView registerClass:[OnboardingCollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];
[self.view addSubview:_collectionView];

我通过在初始化函数中将视图控制器的 automaticallyAdjustsScrollViewInsets 设置为 NO 来解决这个问题。感谢 的启发。

对于 Swift 5.5 使用那个 -> collectionView.contentInsetAdjustmentBehavior = .never