带ContentInset的UICollectionView不是一直向下滚动

时间:2014-06-02 11:25:28

标签: ios objective-c scroll uicollectionview autolayout

我正在设置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,这意味着最后一个单元格低于指定的内容插入:

enter image description here 左侧图像显示了视图出现后它现在的显示方式。在右图中,我手动向下滚动到最后一条消息。

我正在使用AutoLayout,为什么会发生这种情况?

修改

以下是IB设置的屏幕截图: enter image description here

5 个答案:

答案 0 :(得分:31)

今天,我偶然发现了解决方案!

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

enter image description here

如果未选中此选项,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)];
}

答案 1 :(得分:9)

如果您正在使用流布局,请尝试设置_collectionView.collectionViewLayout.sectionInset。

答案 2 :(得分:2)

可能的问题

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

解决方案

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

更新

<强>的CollectionView

按照以下步骤使其正常工作:

检查您的收藏视图,并且不要将其放在工具栏下方,并通过选择文档大纲上的collectionView添加这些约束,单击ctrl并将其拖动到视图中,将出现一个弹出窗口,按住shift并选择这些约束

CollectionView Constraints

<强>工具栏

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

Toolbar Constraints

在viewAppears

之前处理滚动
-(void)viewWillAppear:(BOOL)animated
{
    [collectionView reloadData];
    [self scrollToLastMessageAnimated:YES];
}

答案 3 :(得分:2)

swift version

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

答案 4 :(得分:1)

您可以在viewController类中设置func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize { return CGSize(width: view.frame.width, height: 50) } 函数:

mydata2 <- mydata[ , which(!apply(mydata==0,2,all))]

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