Подтвердить что ты не робот

Как получить indexPath для ячейки, которая расположена в центре UICollectionView

Как найти indexPath для cell в середине UICollectionView?

У меня горизонтальная прокрутка и видна только одна большая cell (частично видны и две другие cell на сторонах). Мне нужно удалить cell, расположенный в центре (средство - текущий cell), не касаясь его.

Только нажатие кнопки "Корзина" и подтверждение "Удалить". Но теперь он удаляет только первые cell s.

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    if (buttonIndex == actionSheet.destructiveButtonIndex) { 
        initialPinchPoint = ????????

        self.tappedCellPath = [self.collectionView indexPathForItemAtPoint:initialPinchPoint];

        Technique *technique = [arrayOfTechnique objectAtIndex:self.tappedCellPath.row];

        [self deleteData:[NSString stringWithFormat:@"DELETE FROM TECHNIQUES WHERE TECHNIQUENAME IS '%s'",[technique.techniquename UTF8String]]];

        [arrayOfTechnique removeObjectAtIndex:self.tappedCellPath.row];

        //[arrayOfTechnique removeObjectAtIndex:[custom_layout ]];
        [self removeImage:technique.techniquename];

        [self.collectionView performBatchUpdates:^{
            [self.collectionView deleteItemsAtIndexPaths:[NSArrayarrayWithObject:self.tappedCellPath]];
         } completion:nil];

         [self checkArrayCount];
    }
}
4b9b3361

Ответ 1

Как и вы, indexPathForItemAtPoint - это хороший способ найти путь индекса интересующего вас элемента. Если ваш вопрос: как узнать координаты этой точки? Затем вы должны попробовать (используя то же имя, которое вы указали в своем фрагменте кода):

initialPinchPoint = CGPointMake(self.collectionView.center.x + self.collectionView.contentOffset.x, 
                                self.collectionView.center.y + self.collectionView.contentOffset.y);

Ответ 2

Это будет лучший код, потому что он чище и легче читать, все вычисления смещения содержимого излишни:

     NSIndexPath *centerCellIndexPath = 
[self.collectionView indexPathForItemAtPoint:
[self.view convertPoint:[self.view center] toView:self.collectionView]];

Это также будет правильным представлением того, что вы на самом деле пытаетесь сделать:
1. Взятие центральной точки вашего viewcontroller view - aka visual center point
2. преобразуйте его в координатное пространство интересующего вас представления - это представление коллекции
3. Получить индексный путь, который существует в указанном месте.

Ответ 3

Вот что я сделал в Swift 3

private func findCenterIndex() {
    let center = self.view.convert(self.collectionView.center, to: self.collectionView)
    let index = collectionView!.indexPathForItem(at: center)
    print(index ?? "index not found")
}

Ответ 4

Swift:

extension UICollectionView {

var centerPoint : CGPoint {

    get {
        return CGPoint(x: self.center.x + self.contentOffset.x, y: self.center.y + self.contentOffset.y);
    }
}

var centerCellIndexPath: IndexPath? {

    if let centerIndexPath: IndexPath  = self.indexPathForItemAtPoint(self.centerPoint) {
        return centerIndexPath
    }
    return nil
}
}

Использование:

if let centerCellIndexPath: IndexPath  = collectionView.centerCellIndexPath {
                print(centerCellIndexPath)
            }

Swift 3:

extension UICollectionView {

var centerPoint : CGPoint {

    get {
        return CGPoint(x: self.center.x + self.contentOffset.x, y: self.center.y + self.contentOffset.y);
    }
}

var centerCellIndexPath: IndexPath? {

    if let centerIndexPath = self.indexPathForItem(at: self.centerPoint) {
        return centerIndexPath
    }
    return nil
}
}

Ответ 5

Спасибо micantox!

У меня было несколько видимых ячеек UICollectionView и для размещения ячейки в центре представления коллекции. Что-то похожее на Adobe Content Viewer. Если кто-то борется с похожим сценарием:

#pragma mark - UIScrollViewDelegate methods

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    CGPoint centerPoint = CGPointMake(self.pageContentCollectionView.center.x + self.pageContentCollectionView.contentOffset.x,
                                    self.pageContentCollectionView.center.y + self.pageContentCollectionView.contentOffset.y);
    NSIndexPath *centerCellIndexPath = [self.pageContentCollectionView indexPathForItemAtPoint:centerPoint];
    [self.pageContentCollectionView scrollToItemAtIndexPath:centerCellIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];

}

Ответ 6

Я сделал как для горизонтального UICollectionView. Я использую Swift 2.x.

private func findCenterIndex() {
    let collectionOrigin = collectionView!.bounds.origin
    let collectionWidth = collectionView!.bounds.width
    var centerPoint: CGPoint!
    var newX: CGFloat!
    if collectionOrigin.x > 0 {
        newX = collectionOrigin.x + collectionWidth / 2
        centerPoint = CGPoint(x: newX, y: collectionOrigin.y)
    } else {
        newX = collectionWidth / 2
        centerPoint = CGPoint(x: newX, y: collectionOrigin.y)
    }

    let index = collectionView!.indexPathForItemAtPoint(centerPoint)
    print(index)
}

 override func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    findCenterIndex()
}

Ответ 7

UICollectionView имеет метод - (NSIndexPath *)indexPathForItemAtPoint:(CGPoint)point.
Этот метод возвращает путь указателя элемента в указанной точке. Вы можете вычислить точку, представляющую центр UICollectionView, а затем использовать этот CGPoint и этот метод для извлечения указательного пути элемента, который вы хотите удалить.

Ответ 8

Попробуйте этот протокол...

protocol CollectionVisibleMidCell {}
extension CollectionVisibleMidCell where Self: UICollectionView {

    func getMidVisibleIndexPath() -> IndexPath? {
        var visibleRect = CGRect()
        visibleRect.origin = self.contentOffset
        visibleRect.size = self.bounds.size
        let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
        guard let indexPath = self.indexPathForItem(at: visiblePoint) else { return nil }
        return indexPath
    }
}

extension UICollectionView: CollectionVisibleMidCell {}

Ответ 9

Swift 4

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    let indexPath = collectionView.indexPathForItem(at: collectionView.bounds.center)        
}

Ответ 10

Основано на ответе @micantox. Обновлен код для Swift 5

let initialPinchPoint = CGPoint(x: collectionView.center.x + collectionView.contentOffset.x,
                                y: collectionView.center.y + collectionView.contentOffset.y)

Ответ 11

Для некоторых из вас, которые могут испытывать некоторые трудности при получении центра, пожалуйста, посмотрите на это потенциальное решение:

 func centerCell()->UICollectionViewCell? {
      // Asuming your scrolling is horizontal
      let viewHorizontalCenter =  self.view.bounds.width / 2
      let center = CGPoint(x: viewHorizontalCenter, y: self.collectionView.center.y)

      let convertedPoint = self.view.convert(center, to: self.unitsCollectionView)

      let center = CGPoint(x: self.view.bounds.width / 2, y: self.unitsCollectionView.center.y)
      let convertedPoint = self.view.convert(center, to: self.unitsCollectionView)
      for cell in unitsCollectionView.visibleCells {
          if cell.frame.contains(convertedPoint) {
              print("Hello")
              return cell
          }
      }
      return nil
    }