Comment trouver indexPath
pour cell
au milieu de UICollectionView
?
J'ai un défilement horizontal et un seul gros cell
est visible (deux autres cell
s 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 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];
}
}
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);
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é.
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")
}
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
}
}
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];
}
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()
}
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.
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 {}
Swift 4
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let indexPath = collectionView.indexPathForItem(at: collectionView.bounds.center)
}