7

我有一个 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];
4

4 回答 4

2

遇到类似的问题,我collectionView在很多地方使用了一行水平,不知何故在一个 ViewControllercollectionView中剪裁了最后一个单元格的一半,而且该单元格不可点击。

我可以通过设置sectionInset.collectionView

viewDidLoad()如果您的 collectionView 在 ViewController中,则只需将此代码放入;如果init在 xib 中,则放入方法。

if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
  flowLayout.sectionInset.right = flowLayout.itemSize.width / 2
}

在我的情况下,缺少的空白空间collectionView.contentSize几乎等于单元格宽度的一半,但您可以将其设置为您想要的任何内容。

我使用.right属性是因为我水平滚动单元格,在垂直滚动的情况下collectionView只使用.bottom属性。

不是很漂亮的修复,但至少它有效。

于 2016-09-23T15:39:22.230 回答
1

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

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

假设您的单元格高 100 像素并且您只有一个部分,我将在 View Controller 中的 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);

当您滚动到底部时,添加额外的 100 可以在最后留出一些空白空间。

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

最后的跟进:将 contentSize 代码放入 viewWillLayoutSubviews 似乎可以获得适当的行为。

于 2014-04-09T11:10:22.907 回答
0

使用 Swift 5,我取得了成功:

myCollectionView.frame.size.width = myContainingView.bounds.width 
于 2021-02-11T01:24:16.323 回答
0

尝试将 collectionView Item 的 Estimate size 设置为自定义,以防自动单元格大小。这对我有用。

在此处输入图像描述

于 2021-05-12T05:50:32.323 回答