【问题标题】:Last Cell in UICollectionView is clippedUICollectionView 中的最后一个单元格被裁剪
【发布时间】:2013-08-26 21:55:53
【问题描述】:

我有一个 UICollectionView,它显示一个垂直的单元格列表。它基本上是一个表格视图,但我使用集合视图来更好地控制每个单元格在视图中的放置方式。由于某种原因,集合视图中的最后一个单元格被剪裁了。我可以向上拖动以查看下半部分,但只要我放手,集合视图就会弹回原位,遮挡最后一个单元格的下半部分。我有一个包含集合视图的 xib,然后我从另一个 xib 注册集合视图单元格。整个视图以编程方式放置在导航控制器中。我的想法是它必须是自动布局的问题。由于我以编程方式将包含集合视图的视图控制器添加到导航控制器,因此在集合视图和导航栏之间没有设置任何约束。如果我隐藏实例化的导航栏并在 IB 中拖出一个,则不会剪切集合视图单元格。但我不想这样做。我已经尝试以编程方式添加约束,但这也不起作用。有没有人有什么建议? 下面是我如何创建导航控制器并将包含集合视图的视图控制器放入其中。此外,我尝试用于添加约束的代码是包含。目前,我在 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];

【问题讨论】:

    标签: ios uicollectionview xib uicollectionviewcell clipped


    【解决方案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);
    

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

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

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

    【讨论】:

    • 这是一个很好的答案。我想问题是为什么 collectionView 不能计算正确的内容大小?一定有问题。
    【解决方案2】:

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

    我可以通过设置sectionInsetcollectionView 轻松解决此问题。

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2018-05-30
          • 1970-01-01
          • 2018-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-25
          相关资源
          最近更新 更多