【问题标题】:UICollectionView with ContentInset is not Scrolling all the Way Down带有 ContentInset 的 UICollectionView 不会一直向下滚动
【发布时间】:2014-07-22 12:06:34
【问题描述】:

我正在设置 UICollectionView 的内容插入:

[_collectionView setContentInset:UIEdgeInsetsMake(0.f, 0.f, 100.f, 0.f)];

然后我使用这种方法以编程方式一直滚动到 UICollectionView 的底部:

- (void)scrollToLastMessageAnimated:(BOOL)animated;
{
    if (_messages.count == 0) { return; }

    NSUInteger indexOfLastSection = _messagesBySections.count - 1;
    NSInteger indexOfMessageInLastSection = [_messagesBySections[indexOfLastSection] count] - 1;
    NSIndexPath *path = [NSIndexPath indexPathForItem:indexOfMessageInLastSection
                                            inSection:indexOfLastSection];

    [_collectionView scrollToItemAtIndexPath:path
                           atScrollPosition:UICollectionViewScrollPositionCenteredVertically
                                   animated:animated];
}

它在向下滚动,但是它忽略了contentInset,这意味着最后一个单元格在指定的content inset之下:

左图显示了视图出现后它现在的样子。在右图中,我手动向下滚动到最后一条消息。

我正在使用 AutoLayout,你知道为什么会这样吗?

编辑:

这是 IB 设置的屏幕截图:

【问题讨论】:

  • 你是如何设置底部约束的?这个问题很可能与集合视图的大小有关,而与内容插图几乎没有关系。
  • 截屏以了解您添加的布局
  • 我认为您的 _collectionView 高度是问题所在。您应该将高度设置为屏幕下方的视图
  • 好的,我添加了我的 IB 设置的屏幕截图...见上文...
  • 好吧,当消息在它下方滚动时,我想要 UIToolbar 的半透明效果。出于这个原因,UICollectionView 位于 UIToolBar 下方,我正在设置 contentInset。

标签: ios objective-c scroll uicollectionview autolayout


【解决方案1】:

可能的问题

您已将 collectionView 设置在工具栏下方,并在两个视图的超级视图底部添加了约束。

解决方案

将工具栏的约束设置为底部,前导并将宽度和高度设置为固定大小。对于您的collectionView,使用工具栏将约束设置为顶部,底部,导致超级视图和(替代)宽度固定大小

更新

CollectionView

按照以下步骤使其工作:

检查您的集合视图,不要将其放在工具栏下方,并通过在 Document Outline 上选择您的 collectionView 添加这些约束,单击 ctrl 并将其拖动到您的视图,将出现一个弹出窗口,按住 shift 并选择这些约束。

工具栏

通过在视图中使用 ctrl 拖动来检查前导和底部。并为工具栏添加固定的宽度和高度。

在 viewAppears 之前处理滚动

-(void)viewWillAppear:(BOOL)animated
{
    [collectionView reloadData];
    [self scrollToLastMessageAnimated:YES];
}

【讨论】:

  • 它没有帮助......这不是他的案例中的 UITabBar,而是底部的 UIToolBar......还有什么想法吗?
  • 将工具栏的约束设置为底部,前导并将宽度和高度设置为固定大小。对于您的collectionView,使用工具栏将约束设置为顶部,底部,导致超级视图和(替代)宽度固定大小
  • 你的方法给了我同样的行为 :( 那么 UIScrollView 也不会在 UIToolbar 下面,缺乏半透明的效果......
  • 好的,效果更好!但是有两个问题: 1) 我的滚动到底部方法在 viewWillAppear: 中不再起作用 - 仅在 viewDidAppear: 使初始滚动到底部 (scrollToLastMessageAnimated:) 对用户可见,这是不需要的。 2)UIToolBar和键盘后面的UICollectionView的半透明效果没了……
  • 你指的是哪个scrollView? collectionView 的滚动条?
【解决方案2】:

如果您使用的是流式布局,请尝试设置 _collectionView.collectionViewLayout.sectionInset。

【讨论】:

  • 这对我有用。当我有大的水平 contentInsets 时,它总是会滚动到第一个项目。当我将插图放在 sectionInset 中时,滚动按预期工作。这似乎不是正确的方法,但它对我有用。
  • 谢谢老兄!节省了我的时间。
  • 经过多次尝试,这个答案挽救了我的一天。谢谢老兄。
【解决方案3】:

今天偶然发现了解决办法!

选择您的视图控制器并取消选中“调整滚动视图插图”选项。

如果未选中此选项,iOS 不会自动调整视图的插图(可能还有它的子视图),这给我带来了问题...取消选中它并像这样以编程方式配置滚动插图:

- (void)configureInsetsOfCollectionView
{
    [_collectionView setContentInset: UIEdgeInsetsMake(self.navigationController.navigationBar.bounds.size.height + [UIApplication sharedApplication].statusBarFrame.size.height + DEFAULT_SPACING, 0.f, _keyboardHeight + _toolbar.bounds.size.height + DEFAULT_SPACING, 0.f)];
    [_collectionView setScrollIndicatorInsets:UIEdgeInsetsMake(self.navigationController.navigationBar.bounds.size.height + [UIApplication sharedApplication].statusBarFrame.size.height, 0.f, _keyboardHeight + _toolbar.bounds.size.height, 0.f)];
}

【讨论】:

  • 在这上面花了几个小时,我以前的解决方案最近被弃用了,谢谢! 太多了!
  • hooray 完美运行:D——我也相当确定 UITableView 也同样适用
【解决方案4】:

您可以在 viewController 类中设置referenceSizeForFooterInSection 函数:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {
    return CGSize(width: view.frame.width, height: 50)
}

只需将高度设置为所需的值即可。

【讨论】:

    【解决方案5】:

    快捷版

    collectionview.contentInset = UIEdgeInsetsMake(44,0,0,0)
    collectionview.scrollIndicatorInsets = UIEdgeInsetsMake(44,0,0,0)
    

    【讨论】:

    • 这个是倒过来的,应该是UIEdgeInsets(top: 0, left: 0, 44, right: 0)
    【解决方案6】:

    以编程方式,我使用 (Swift 5) 解决了这个问题:

    collectionView.contentInsetAdjustmentBehavior = .never
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 2019-10-04
      • 1970-01-01
      相关资源
      最近更新 更多