L'obtention de l'emplacement d'un écran d'une cellule à partir d'un UICollectionView

Ce n'est pas tellement une question comme une explication de la façon de résoudre ce problème.

La première chose à réaliser est que les UICollectionView n'hériter que d'une UIScrollView - donc en faisant un standard de recherche avec un défilement de l'affichage du contenu est la meilleure solution.

Voici le problème que je m'adressais:

J'ai eu un UICollectionView qui avait différents éléments dans chaque cellule, avec différents types de cellules. J'ai besoin de la sélection d'une cellule provoque un effet de l'image dans la cellule à apparaître à développer et prendre en charge la totalité de l'écran. Comment j'ai fait de l'expansion est pour un autre post.

Le défi a été d'obtenir les cellules de la position sur l'écran de sorte que l'animation de la section aurait un point de référence à partir de laquelle commencer.

De faciliter l'obtention de cette information - considérons le code suivant:

Première remarque:

UICollectionView *picturesCollectionView;
DrawingCell cell; //-> instanceof UICollectionViewCell with custom items.
//first, get the list of cells that are visible on the screen - you must do this every time
//since the items can change...  This is a CRITICAL fact.  You do not go through the
//entire list of cells - only those the collectionView indicates are visible.  Note 
//there are some things to watch out for - the visibles array does not match the indexPath.item
//number - they are independent.  The latter is the item number overall the cells, while
//the visibles array may have only 2 entries - so there is NOT a 1-to-1 mapping - keep
//that in mind.
NSArray *visibles = [self.picturesCollectionView visibleCells];
//now, cycle through the times and find the one that matches some criteria.  In my
//case, check that the cell for the indexPath passed matches the cell's imageView...
//The indexPath was passed in for the method call - note that the indexPath will point
//to the number in your datasource for the particular item - this is crucial.
for (int i=0; i<visibles.count; i++) {
DrawingCell *cell = (DrawingCell *)visibles[i];
if (cell.imageView.image == (UIImage *)images[indexPath.item]) {
//at this point, we've found the correct cell - now do the translation to determine
//what is it's location on the current screen...  You do this by getting the contentOffset
//from the collectionView subtracted from the cell's origin - and adding in (in my case)
//the frame offset for the position of the item I wish to animate (in my case the
//imageView contained within my custom collection cell...
CGFloat relativeX = cell.frame.origin.x - self.picturesCollectionView.contentOffset.x + cell.imageView.frame.origin.x;
CGFloat relativeY = cell.frame.origin.y - self.picturesCollectionView.contentOffset.y + cell.imageView.frame.origin.y;
//I now have the exact screen coordinates of the imageView - so since I need this
//to perform animations, I save it off in a CGRect - in my case, I set the size
//exactly to the size of the imageView - so say you were doing a Flicker display
//where you wanted to grow a selected image, you get the coordinates of the image
//in the cell and the size from the displayed image...
UIImageView *image = cell.imageView;
//selectedCell is a CGRect that's global for the sake of this code...
selectedCell = cell.frame;
selectedCell.origin.x = relativeX;
selectedCell.origin.y = relativeY;
selectedCell.size.width = cell.imageView.frame.size.width;
selectedCell.size.height = cell.imageView.frame.size.height;
}
}
//done.  I have my coordinates and the size of the imageView I wish to animate and grow...

Espérons que cela aide d'autres gens qui sont à essayer de comprendre comment à-dire la superposition de quelque chose dans la cellule, dans une position exacte, etc...

  • Je suggère fortement de vous casser en deux parties; votre problème / question et une réponse. Vous pouvez sans problème ajouter votre propre réponse à une question.
  • Malheureusement, il semble que beaucoup de choses se sont perdus lors de la soumission. En regardant le source de cette page, il y a au moins près de deux pages de codage avec perte donc, ce post devrait être supprimé et je vais vous expliquer le processus à nouveau.
  • pour ce post. j'ai eu des problèmes avec l'obtention d'une bonne animation à partir du centre de collecte de vue de la cellule. même si j'avais la cellule sélectionnée, j'ai été à l'aide de son centre de bien comme le point de départ de l'animation, une fois que j'ai commencé à défilement de la collecte, de l'animation était de commencer quelque chose hors de l'écran. à l'aide de points à partir de votre post, j'ai été en mesure de corriger cela.
  • Double de stackoverflow.com/q/12504924/1698467
  • Avez-vous jamais faire l'autre post expliquant comment vous avez fait de l'expansion? C'est exactement ce dont j'ai besoin pour le même scénario...actuellement, quand j'appuie sur l'image dans la cellule, je suis de l'animation d'un nouveau UIView avec une ImageView qui prend tout l'écran. Fonctionne parfaitement, SAUF que l'animation commence dans le centre de l'écran. J'aimerais qu'il commence à partir du point de la cellule qui a été exploité. Si je vous comprends bien, ce est exactement ce que vous avez fait. Merci à l'avance!
InformationsquelleAutor Joe Jupin | 2013-02-06