uitableviewcell inside didselectitematindexpath ios uicollectionview uicollectionviewcell

ios - inside - Obteniendo la ubicación de la pantalla de una celda desde un UICollectionView



uicollectionview inside uitableviewcell (5)

Bueno, la primera parte de tu pregunta es bastante clara, ¿la segunda? de todos modos, si lo que desea obtener es el marco de la celda de selección de su colección, puede usar esto:

UICollectionViewLayoutAttributes *attributes = [self.collectionView layoutAttributesForItemAtIndexPath:indexPath]; CGRect cellRect = attributes.frame;

Más información here

Esto no es tanto una pregunta como una explicación de cómo resolver este problema.

Lo primero es darse cuenta de que UICollectionView hereda de UIScrollView , por lo que hacer una búsqueda estándar con contenido de vista de desplazamiento es la mejor solución.

Este es el problema al que me estaba dirigiendo:

Tenía un UICollectionView que tenía elementos diferentes en cada celda, junto con diferentes tipos de celdas. Necesito la selección de una celda para que aparezca un efecto de la imagen en la celda que se expanda y tome el control de toda la pantalla. Cómo lo hice la expansión es para otra publicación.

El desafío era obtener la posición de la celda en la pantalla para que la sección de animación tuviera un punto de referencia desde donde comenzar.

Entonces, para facilitar el acceso a esta información, considere el siguiente código:

Primera nota:

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

Con suerte, esto ayuda a otras personas que están tratando de descubrir cómo superponer algo en la celda en una posición exacta, etc.


He hecho esto antes también. tomó un tiempo pero es posible.

Tienes que usar

[currentImageView.superview convertRect:currentImageView.frame toView:translateView]

Donde currentImageView es la imagen que el usuario toca. Su superview será la célula. Desea convertir el rect de su imagen a donde realmente está en una vista diferente. Esa vista se llama "translateView" aquí.

Entonces, ¿qué es translateView? En la mayoría de los casos es solo self.view .

Esto le dará un nuevo marco para su vista de la imagen que se encontrará donde se encuentra su imagen en su mesa. Una vez que tenga eso, puede expandir la imagen para ocupar toda la pantalla.

Aquí está una esencia del código que utilizo para tocar una imagen, luego expandir la imagen y mostrar un nuevo controlador que permite el barrido de la imagen.

https://gist.github.com/farhanpatel/4964372


La solución @Alivin que usa layoutAttributesForItemAtIndexPath funciona pero solo para la vista de desplazamiento presentada / actual que el usuario ve.

Es decir, si selecciona las primeras celdas visibles presentadas, obtendrá el frame real, pero si se desplaza, el frame tendrá una desviación y no obtendrá las coordenadas que necesita.

Es por eso que necesita usar convertPoint: toView :

let realCenter = collectionView.convertPoint(cell.center, toView: collectionView.superview)

Básicamente este método toma un punto (cell.center) en una vista y convierte ese punto a otra vista (collectionView.superview) sistema de coordenadas que es exactamente lo que necesitamos.

Por lo tanto, realCenter siempre contendrá las coordenadas de la celda seleccionada real.


Una alternativa es usar los eventos para proporcionar la mayoría, si no todas, las respuestas a sus preguntas.

Supongo que un evento táctil iniciará todo esto, así que vamos a implementar algo significativo;

//First, trap the event in the collectionView controller with; - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ // lets ensure it''s actually visible (yes we got here from a touch event so it must be... just more info) if ([self.collectionView.indexPathsForVisibleItems containsObject:indexPath]) { // get a ref to the UICollectionViewCell at indexPath UICollectionViewCell *cell =(UICollectionViewCell *)[self.collectionView cellForItemAtIndexPath:indexPath]; //finally get the rect for the cell CGRect cellRect = cell.frame // do your processing here... a ref to the cell will allow you to drill down to the image without the headache!! } }

oh ... antes de salir corriendo para la hora feliz, no olvidemos leer;

<UICollectionViewDelegate> (hint - it''s needed)


-(void)collectionView:(UICollectionView *)cv didSelectItemAtIndexPath:(NSIndexPath *)indexPath; { UICollectionViewLayoutAttributes *attributes = [cv layoutAttributesForItemAtIndexPath:indexPath]; CGRect cellRect = attributes.frame; CGRect cellFrameInSuperview = [cv convertRect:cellRect toView:[cv superview]]; NSLog(@"%f",cellFrameInSuperview.origin.x); }

Funciona para mí. Puedes probarte