web-dev-qa-db-fra.com

comment obtenir indexPath pour une cellule située au centre de UICollectionView

Comment trouver indexPath pour cell au milieu de UICollectionView?

J'ai un défilement horizontal et un seul gros cell est visible (deux autres cells sur les côtés sont également visibles) . Je dois supprimer cell situé au centre (moyen - courant cell) sans le toucher.

En appuyant simplement sur le bouton "Corbeille" et confirmez la suppression. Mais maintenant, il ne supprime que les premiers cells.

- (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];
    }
}
42
Sasha Prent

Comme vous l'avez fait vous-même, indexPathForItemAtPoint est un bon moyen de trouver le chemin d'index de l'élément qui vous intéresse. Si votre question est: comment puis-je connaître les coordonnées de ce point? Ensuite, vous devriez essayer avec (en utilisant le même nom que celui que vous avez donné dans votre extrait de code):

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

Ce serait un meilleur code parce que c'est plus propre et plus facile à lire, tout le calcul du décalage de contenu est superflu:

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

Ce serait aussi la bonne représentation de ce que vous essayez réellement de faire:
1. Prendre le point central de la vue de votre contrôleur - alias point central visuel
2. convertissez-le dans l'espace de coordonnées de la vue qui vous intéresse - qui est la vue de collection
3. Récupère le chemin d'index existant à l'emplacement indiqué.

33
Jlam

Voici ce que j'ai fait dans 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")
}
21
MCR

Rapide:

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

Utilisation:

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
}
}
17
Bobj-C

Merci micantox!

J'avais plusieurs cellules visibles de UICollectionView et devais positionner la cellule au centre de la vue de collection. Quelque chose de semblable à Adobe Content Viewer. Si quelqu'un se débat avec un scénario similaire:

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

}
8
DarkoM

J'ai fait comme pour UICollectionView horizontal j'utilise 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()
}
5
Alexander Khitev

UICollectionView a une méthode - (NSIndexPath *)indexPathForItemAtPoint:(CGPoint)point.
Cette méthode renvoie le chemin d’index de l’élément au point spécifié. Vous pouvez calculer le point qui représente le centre de la UICollectionView, puis utiliser cette CGPoint et cette méthode pour récupérer le chemin d'index de l'élément à supprimer.

2
s1m0n

Essayez ce protocole ...

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 {}
0
James Rochabrun

Swift 4

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