在底部启动UICollectionView

问题描述 投票:9回答:7

在iOS 7中,给定一个UICollectionView,你如何在底部启动它?想想iOS消息应用程序,当视图变得可见时,它始终从底部开始(最新消息)。

ios cocoa-touch ios7 uikit uicollectionview
7个回答
4
投票

问题是,如果您尝试在viewWillAppear中设置集合视图的contentOffset,则集合视图尚未呈现其项目。因此,self.collectionView.contentSize仍为{0,0}。解决方案是询问集合视图的内容大小布局。

此外,您还需要确保仅在contentSize高于集合视图的边界时才设置contentOffset。

完整的解决方案如下:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    CGSize contentSize = [self.collectionView.collectionViewLayout collectionViewContentSize];
    if (contentSize.height > self.collectionView.bounds.size.height) {
        CGPoint targetContentOffset = CGPointMake(0.0f, contentSize.height - self.collectionView.bounds.size.height);
        [self.collectionView setContentOffset:targetContentOffset];
    }
}

5
投票

@awolf你的解决方案很好!但是不能正常使用autolayout。

你应该先调用[self.view layoutIfNeeded]!完整解决方案是:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // ---- autolayout ----
    [self.view layoutIfNeeded];

    CGSize contentSize = [self.collectionView.collectionViewLayout collectionViewContentSize];
    if (contentSize.height > self.collectionView.bounds.size.height) {
        CGPoint targetContentOffset = CGPointMake(0.0f, contentSize.height - self.collectionView.bounds.size.height);
        [self.collectionView setContentOffset:targetContentOffset];
    }
}

2
投票

这对我有用,我认为这是一种现代方式。

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.collectionView!.scrollToItemAtIndexPath(indexForTheLast, atScrollPosition: UICollectionViewScrollPosition.Bottom, animated: false)
}

1
投票
yourCollectionView.contentOffset = CGPointMake(0, yourCollectionView.contentSize.height - yourCollectionView.bounds.size.height);

但请记住,只有当你的contentSize.height> bounds.size.height时这样做。


0
投票

假设您知道集合视图中有多少项可以使用

scrollToItemAtIndexPath:atScrollPosition:animated:

Apple Docs


0
投票

它适合我(自动布局)

  1. 使用collectionViewFlowLayout和cellSize计算ScrollView的内容大小
  2. collectionView.contentSize = calculatedContentSize
  3. collectionView.scrollToItemAtIndexPath(whichWouTantTrollIndexPath,atScrollPosition:...)

0
投票

scrollToItemAtIndexPath:atScrollPosition:animated:viewWillLayoutSubviews中添加,以便collectionView将立即加载到底部

© www.soinside.com 2019 - 2024. All rights reserved.