什么时候`UICollectionView`结束了

时间:2015-02-23 09:49:10

标签: ios objective-c uiscrollview uibutton uicollectionview

我正在使用UICollectionView并使用UIButton从单元格滚动到单元格。 当我来到集合视图的末尾时,我想要button.hidden = YES。我如何知道currentIndex == MAX

的时间

7 个答案:

答案 0 :(得分:7)

集合视图是滚动视图。因此,您可以访问所有滚动视图委托方法 - 每次滚动视图移动时都会调用scrollViewDidScroll:,如果您已滚动到底部,结束或任何位置,则可以检查该点。< / p>

请注意,contentOffset属性将引用可见滚动区域的原点,因此最简单的方法是检查这样的内容:

if (CGRectGetMaxY(scrollView.bounds) == scrollView.contentSize.height) {
    button.hidden = YES;
}

如果您自己滚动视图,则不会调用此委托方法,但是 - 只有在用户滚动视图时才会应用此方法。您需要在自动滚动代码的末尾自己调用它,或者在自动滚动代码中使用类似的逻辑来自行检查。

答案 1 :(得分:3)

您可以通过使用if语句来检查当前indexPath是否显示数据源数组中的最后一个对象。

if(indexPath.row == [dataSourceArray count]){
//Last cell was drawn
}

答案 2 :(得分:3)

您可以直接检测我们何时处于集合视图的底部并执行类似的操作..

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // getting the scroll offset
    CGFloat bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height;

    if (bottomEdge >= scrollView.contentSize.height)
    {
        // we are at the bottom
        button.hidden = YES;
    }
}

当您到达集合视图中的scrollView底部时,您可以执行任何操作。

答案 3 :(得分:2)

这是我的代码,显示最后一个单元格何时开始出现(Swift 4):

override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if indexPath.row == dataArray.count - 1 {
        // do something
    }
}

答案 4 :(得分:1)

另一种方法是检测collectionView:cellForItemAtIndexPath是否到达最后一部分或最后一行。

例如,您可以有两个部分,一个部分用于显示内容,另一个部分用作当前视图滚动到结尾的指示符:

public func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        if indexPath.section == 2 { // or if indexPath.row == myDat.count
            // CollectionView is scrolled to the bottom
            self.state = .Loading
            // Do something
        }
    }

不要忘记设置和重置视图状态以避免被困在一个状态:

public func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return self.state == .Loading ? 1 : 2
}

而且,您还可以使用其他UICollectionViewDelegate方法进行检测,例如:

func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
    if indexPath.row == yourData.count{
        self.state = .Loading
        // Do something
    }
}

答案 5 :(得分:0)

我认为其中任何一项都可以帮到你

1.只要滚动动作停止或底部

scrollview delegate就会调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    for (UICollectionViewCell *cell in [self.collectionView visibleCells]) {
        NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];
        NSUInteger lastIndex = [indexPath indexAtPosition:[indexPath length] - 1];
    }
}

  1. 您可以使用类似的内容来检查集合视图的最后一个索引

    NSInteger section = [self numberOfSectionsInCollectionView:self.collectionView] - 1;
    NSInteger item = [self collectionView:self.collectionView numberOfItemsInSection:section] - 1;
    NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:item inSection:section];
    

答案 6 :(得分:0)

Swift 4版本

override func collectionView(_ collectionView: UICollectionView, willDisplaySupplementaryView view: UICollectionReusableView, forElementKind elementKind: String, at indexPath: IndexPath) {

            if (elementKind == UICollectionElementKindSectionHeader) {
                view.layer.zPosition = 0;
            }
    }