UICollectionView 滚动到没有动画的最后一项

Posted

技术标签:

【中文标题】UICollectionView 滚动到没有动画的最后一项【英文标题】:UICollectionView scroll to last item without Animation 【发布时间】:2014-06-02 15:17:43 【问题描述】:

我有一个 UICollectionView 来显示聊天消息。一开始我将现有消息加载到 collectionView 并使用此方法将 collectionView 向下滚动到最后一条消息:

- (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];

仅当我在 viewDidAppear: 方法中调用它而不是在 viewWillAppear: 方法中调用它时,它才可以动画。如何在没有动画的情况下向下滚动?

【问题讨论】:

如果水平我使用这个 CGFloat startx = self.neWBooksCollectionView.contentSize.width - 320; [self.neWBooksCollectionView scrollRectToVisible:CGRectMake(startx, 0, 320, 1) 动画:YES]; 【参考方案1】:

这里是……

NSInteger section = [self.collectionView numberOfSections] - 1;
NSInteger item = [self.collectionView numberOfItemsInSection:section] - 1;
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:item inSection:section];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:(UICollectionViewScrollPositionBottom) animated:YES];

【讨论】:

【参考方案2】:

我也在你的另一个问题中提供了我的答案,但我也写在这里,因为这个答案只与这个问题有关

解决方案

要在最后一个索引处滚动视图而不在视图出现之前崩溃,您首先需要触发您的 collectionView 数据的重新加载。重新加载后,调用您的方法来滚动视图。

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

更新

[collectionView setContentOffset:CGPointMake(0, CGFLOAT_MAX)]

【讨论】:

它不起作用:/根本没有滚动发生,只有当我在 viewDidAppear 中调用该方法时: @BenMarten 在视图出现之前定义它的偏移量。答案已编辑 setContentOffset 对我有用。您只需要确保创建正确的点,具体取决于您的布局。例如,对于水平滚动布局,您应该传递 CGPointMake(CGFLOAT_MAX, 0) ,因为您想影响 x 坐标,而不是 y。【参考方案3】:

Swift 3.0 代码:

let index = IndexPath(item: (self.mFetchedResultsControllerVar?.fetchedObjects?.count)! - 1, section: 0)
self.collectionView?.scrollToItem(at: index, at: UICollectionViewScrollPosition.bottom, animated: true)

【讨论】:

【参考方案4】:

处理多个/0 部分/项目的更简单的解决方案

extension UICollectionView 
    func scrollToLastItem(at scrollPosition: UICollectionViewScrollPosition = .centeredHorizontally, animated: Bool = true) 
        let lastSection = numberOfSections - 1
        guard lastSection >= 0 else  return 
        let lastItem = numberOfItems(inSection: lastSection) - 1
        guard lastItem >= 0 else  return 
        let lastItemIndexPath = IndexPath(item: lastItem, section: lastSection)
        scrollToItem(at: lastItemIndexPath, at: scrollPosition, animated: animated)
    

【讨论】:

【参考方案5】:

此扩展滚动到实际包含项目的最后一个部分。 迄今为止最好的方法。

public extension UICollectionView 
    func scrollToLastItem() 
        scrollToLastItem(animated: true, atScrollPosition: .bottom)
    

    func scrollToLastItem(animated: Bool, atScrollPosition scrollPosition: UICollectionViewScrollPosition) 
        guard numberOfSections > 0 else 
            return
        

        var sectionWithItems: SectionInfo?
        for section in Array(0...(numberOfSections - 1)) 
            let itemCount = numberOfItems(inSection: section)
            if itemCount > 0 
                sectionWithItems = SectionInfo(numberOfItems: itemCount, sectionIndex: section)
            
        

        guard let lastSectionWithItems = sectionWithItems else 
            return
        

        let lastItemIndexPath = IndexPath(row: lastSectionWithItems.numberOfItems - 1, section: lastSectionWithItems.sectionIndex)
        scrollToItem(at: lastItemIndexPath, at: scrollPosition, animated: animated)
    

【讨论】:

【参考方案6】:

这个问题实际上是由有问题的 Autolayout 约束引起的, 请参阅我的其他帖子以了解最终帮助我的解决方案:https://***.com/a/24033650/2302437

【讨论】:

以上是关于UICollectionView 滚动到没有动画的最后一项的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionVIew:在视图滚动时为单元格设置动画

UICollectionView 图像视图动画

UIScrollView 或 UICollectionView 中的自定义滚动行为

UICollectionView 滚动时 UIView 动画停止工作

UICollectionView 水平滚动,删除最后一项,动画不起作用

在 UICollectionView/UITableView 中为滚动视图的偏移设置动画会导致单元格过早消失