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

时间:2013-08-23 18:43:13

标签: ios uicollectionview xib uicollectionviewcell clipped

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

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 个答案:

答案 0 :(得分:1)

进入类似的问题,我有一个水平collectionView,我在很多地方使用了一行,不知何故,在一个ViewController collectionView中,裁剪了最后一个单元格的一半,该单元格也无法点击。“ / p>

我可以通过设置sectionInset的{​​{1}}来轻松解决此问题。

如果你的collectionView在ViewController或collectionView方法中,如果它在xib中,只需将此代码放在viewDidLoad()中。

init

在我的情况下,if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout { flowLayout.sectionInset.right = flowLayout.itemSize.width / 2 } 中缺少空格几乎等于单元格宽度的一半,但您可以将其设置为您想要的任何内容。

我使用collectionView.contentSize属性,因为我是水平滚动单元格,如果是垂直滚动.right,只需使用collectionView属性。

不是很好修复,但至少它有效。

答案 1 :(得分:0)

我刚遇到类似的问题。问题源于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);

当你滚动到底部时,添加额外的100允许在末尾有一些空的空间。

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

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

答案 2 :(得分:0)

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

myCollectionView.frame.size.width = myContainingView.bounds.width 

答案 3 :(得分:0)

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

enter image description here