2014-01-23 2 views
7

Каков правильный синтаксис для использования индекса UICollectionView indexPathForItemAtPoint?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]; 
} 

Однако это всегда дает мне тот же индексный паспорт, как бы я ни прокручивал.

Что я делаю неправильно?

ответ

31

Вы ищете статическую точку в статическом поле ячеек. Да, вы всегда будете получать одну и ту же ячейку.

Чтобы справиться с прокруткой, вам нужно добавить позицию прокрутки в ваш чек. Что-то вроде этого:

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

Ты гений, Putz. СПАСИБО! – theDuncs

+2

Это предложение кажется странно оксюмороническим ... – Putz1103

+0

Я не думаю, что это работает. IndexPath всегда будет возвращать нуль. Я ищу другое решение. –

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]; 
} 
0

Дункан, это то, что он работает для меня в 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 
      } 

Вы должны иметь в виду прокрутку вида коллекции.

+0

Хавьер! До встречи в NSBarcelona! – theDuncs

1

Вот как сделать это в Swift, если вы хотите получить конкретный UICollectionViewCell с UILongPressGesture

@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 
    } 
} 
Смежные вопросы