UICollectionView自动滚动到细胞在IndexPath(UICollectionView

2019-08-22 16:06发布

加载集合视图用户之前设置图像的集合视图阵列中的数量。 所有的细胞不适合在屏幕上。 我有30个细胞,只在屏幕上6。

问题:如何滚动至所需图像的细胞在UICollectionView的负载自动?

Answer 1:

我发现,在滚动viewWillAppear ,因为集合视图还没有完成它的布局却可能无法可靠地工作; 您可以滚动到错误的项目。

我还发现,在滚动viewDidAppear会导致视未涡卷的瞬间闪光可见。

而且,如果你通过滚动每次viewDidLayoutSubviews ,用户将无法手动滚动,因为一些集合布局导致子视图布局每次滚动的时间。

这是我发现的可靠工作:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    // If we haven't done the initial scroll, do it once.
    if (!self.initialScrollDone) {
        self.initialScrollDone = YES;

        [self.collectionView scrollToItemAtIndexPath:self.myInitialIndexPath
                                    atScrollPosition:UICollectionViewScrollPositionRight animated:NO];
    }
}


Answer 2:

新编辑的答案:

在添加此viewDidLayoutSubviews

迅速

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let indexPath = IndexPath(item: 12, section: 0)
    self.collectionView.scrollToItem(at: indexPath, at: [.centeredVertically, .centeredHorizontally], animated: true)
}

通常情况下, .centerVertically的话

ObjC

-(void)viewDidLayoutSubviews {
   [super viewDidLayoutSubviews];
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:12 inSection:0];
   [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically | UICollectionViewScrollPositionCenteredHorizontally animated:NO];
}

旧的答案对老年人的iOS工作

在添加此viewWillAppear

[self.view layoutIfNeeded];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];


Answer 3:

我完全同意上述的答案一致。 唯一的一点是,我将溶液设置代码在viewDidAppear

viewDidAppear 
{
    [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES];
}

当我用viewWillAppear中滚动没有工作。



Answer 4:

这似乎为我工作,它类似于另一种答案,但有一些明显的区别:

- (void)viewDidLayoutSubviews
{     
   [self.collectionView layoutIfNeeded];
   NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems];
   NSIndexPath *currentItem = [visibleItems objectAtIndex:0];
   NSIndexPath *nextItem = [NSIndexPath indexPathForItem:someInt inSection:currentItem.section];

   [self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionNone animated:YES];
}


Answer 5:

迅速:

your_CollectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true)

斯威夫特3

let indexPath = IndexPath(row: itemIndex, section: sectionIndex)

collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.right, animated: true)

滚动位置:

UICollectionViewScrollPosition.CenteredHorizontally / UICollectionViewScrollPosition.CenteredVertically


Answer 6:

您可以使用GCD到滚动派遣到主运行循环的viewDidLoad中的下一个迭代,以实现这种行为。 集合视图显示在屏幕上之前将进行滚动,所以不会有闪烁。

- (void)viewDidLoad {
    dispatch_async (dispatch_get_main_queue (), ^{
        NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH;
        [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
    });
}


Answer 7:

我建议在做这件事collectionView: willDisplay:然后你就可以确保集合观点代表提供的东西。 这里我举的例子:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    /// this is done to set the index on start to 1 to have at index 0 the last image to have a infinity loop
    if !didScrollToSecondIndex {
        self.scrollToItem(at: IndexPath(row: 1, section: 0), at: .left, animated: false)
        didScrollToSecondIndex = true
    }
}


Answer 8:

这里所有的答案 - 黑客。 我已经找到更好的办法来relaodData后滚动某处集合视图:
子类集合视图布局什么都布局在使用,重写方法prepareLayout,超级呼叫建立什么都偏移,您需要之后。
例如: https://stackoverflow.com/a/34192787/1400119



文章来源: UICollectionView auto scroll to cell at IndexPath