尽管滚动,UICollectionView indexPathForItemAtPoint返回相同的项目

时间:2014-01-23 15:16:25

标签: ios objective-c uicollectionview

使用UICollectionView的indexPathForItemAtPoint的正确语法是什么?

当我滚动浏览时,我正在使用以下代码尝试识别位于UICollectionView中心的单元格。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    //locate the scrollview which is in the centre
    CGPoint centerPoint = CGPointMake(self.collectionView.frame.size.width / 2, self.collectionView.frame.size.height /2);
    NSIndexPath *indexPathOfCentralCell = [self.collectionView indexPathForItemAtPoint:centerPoint];
}

然而,无论我如何滚动,这总是给我相同的indexPath。

我做错了什么?

4 个答案:

答案 0 :(得分:33)

您正在查找静态单元格中的静态点。是的,你将永远得到相同的细胞。

为了处理滚动,您需要将scrollview的位置添加到支票中。像这样:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    //locate the scrollview which is in the centre
    CGPoint centerPoint = CGPointMake(self.collectionView.frame.size.width / 2 + scrollView.contentOffset.x, self.collectionView.frame.size.height /2 + scrollView.contentOffset.y);
    NSIndexPath *indexPathOfCentralCell = [self.collectionView indexPathForItemAtPoint:centerPoint];
}

答案 1 :(得分:1)

您要执行此操作的示例是,您希望在UICollectionView上捕获手势,然后对UICollectionView中属于滑动手势位置的特定项执行某些操作。下面的代码作为UICollectionViewController中的方法将返回正确的单元格,并考虑在集合视图中滚动。

- (UICollectionViewCell *) cellForGesture:(id)sender
{
    UISwipeGestureRecognizer * gesture = sender;
    CGPoint point = [gesture locationInView:self.view];
    NSLog(@"Swipe location: %f, %f", point.x, point.y, nil);

    CGPoint pointInCollection = CGPointMake(point.x + self.collectionView.contentOffset.x, point.y + self.collectionView.contentOffset.y);

    NSIndexPath * indexPath = [self.collectionView indexPathForItemAtPoint:pointInCollection];
    UICollectionViewCell * cell = [self.collectionView cellForItemAtIndexPath:indexPath];
    return cell;
}

你可以在这样的上下文中调用上面的方法(其中revealSupplementalControls是你的UICollectionViewCell类的自定义方法):

- (IBAction) swipeLeft:(id)sender {
    UICollectionViewCell * cell = [self cellForGesture:sender];
    [cell revealSupplementalControls];
}

答案 2 :(得分:1)

如果要使用UILongPressGesture检索特定的UICollectionViewCell,可以在Swift中执行此操作

@IBAction func cellAtLongPress(sender:UILongPressGestureRecognizer) {

    var location = sender.locationInView(self.view)

    // adjust the location to account for scrolling
    location.x += self.collectionView.contentOffset.x
    location.y += self.collectionView.contentOffset.y

    let indexPath = self.collectionView.indexPathForItemAtPoint(location)

    if (indexPath == nil) {
        print("not over cell")
    } else {
        // get the cell where the longPress occured
        let cell = self.collectionView.cellForItemAtIndexPath(indexPath!)!

        // you now have the the cell you pressed
    }
}

答案 3 :(得分:0)

Duncan,这是它在Swift中对我有用的东西:

   let location = CGPointMake(self.clvGroups.frame.size.width / 2 +
                self.clvGroups.contentOffset.x, self.clvGroups.frame.size.height / 2 + self.clvGroups.contentOffset.y);
   if let ip = self.clvGroups.indexPathForItemAtPoint(location){
                 groupToUpdate.icon = self.dataSource![ip.row].icon
            }

您必须记住集合视图的滚动视图。