UICollectionView 中的最后一个单元格被剪裁

mik*_*ike 7 xib ios clipped uicollectionview uicollectionviewcell

我有一个 UICollectionView 显示单元格的垂直列表。它基本上是一个表格视图,但我使用集合视图来控制每个单元格在视图中的放置方式。出于某种原因,集合视图中的最后一个单元格被剪裁了。我可以向上拖动以查看下半部分,但是一旦我松开,集合视图就会弹回原位,遮住最后一个单元格的下半部分。我有一个包含集合视图的 xib,然后我从另一个 xib 注册集合视图单元格。整个视图以编程方式放置在导航控制器中。我的想法是它必须是自动布局的问题。由于我以编程方式将包含集合视图的视图控制器添加到导航控制器,因此集合视图和导航栏之间没有设置任何约束。如果我隐藏实例化的导航栏并在 IB 中拖出一个,则不会剪切集合视图单元格。但我不想这样做。我试过以编程方式添加约束,但这也不起作用。有没有人有什么建议?下面是我如何创建导航控制器并将包含集合视图的视图控制器放入其中。此外,我试图用来添加约束的代码是包含。目前,我正在 didFinishLaunchingWithOptions 中的应用程序委托中执行此操作:m 创建导航控制器并将包含集合视图的视图控制器放入其中。此外,我试图用来添加约束的代码是包含。目前,我正在 didFinishLaunchingWithOptions 中的应用程序委托中执行此操作:m 创建导航控制器并将包含集合视图的视图控制器放入其中。此外,我试图用来添加约束的代码是包含。目前,我正在 didFinishLaunchingWithOptions 中的应用程序委托中执行此操作:

self.homeViewController = [[FFHomeViewController alloc] init];
FFNavigationPanelViewController *navigationController = [[FFNavigationPanelViewController alloc] init];
UINavigationController *frontNavigationController = [[UINavigationController alloc] initWithRootViewController:self.homeViewController];
//    frontNavigationController.navigationBarHidden = YES;
UINavigationController *rearNavigationController = [[UINavigationController alloc] initWithRootViewController:navigationController];


NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.homeViewController.collectionView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.homeViewController.navigationController.navigationBar attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];

[self.viewController.frontViewController.view addConstraint:topConstraint];
Run Code Online (Sandbox Code Playgroud)

Eri*_*son 1

我刚刚遇到了类似的问题。问题源于这样一个事实,即 UICollectionView 是 UIScrollView 的子类,并且由于某种原因,分配给内容的空间量没有更新以对应您拥有的实际单元格数量。

在您的情况下,对于单列项目,您需要设置 UICollectionView 的 contentSize 以匹配虚拟显示所有 UICollectionViewCell 所需的空间量。

假设您的单元格高 100 像素,并且只有一个部分,我将向视图控制器中的 ViewWillAppear 添加如下内容:

int itemCount = [self.collectionView numberOfItemsInSection:0];
float contentHeight = (100*itemCount)+100;
CGRect screenFrame = [[UIScreen mainScreen]bounds];
self.collectionView.contentSize = CGSizeMake(screenFrame.size.width, frameHeight);
Run Code Online (Sandbox Code Playgroud)

添加额外的 100 可以在滚动到底部时在末尾留出一些空白空间。

旁注:我可能在这里遇到了一个奇怪的错误。当我将这些计算放入任何 viewWillLoad|viewWillAppear|viewDidAppear 中时,它似乎没有生效,但奇怪的是,将其放入 numberOfItemsInSection 中确实有效。这确实不是合适的地方,但可能是从 xib 加载 collectionView 而不是以编程方式创建它的副作用。

最后的后续行动:将 contentSize 代码放入 viewWillLayoutSubviews 似乎获得了适当的行为。