objective hig framework ios objective-c uikit

hig - swift ios documentation



¿Cómo hacer zoom en un UIScrollView dentro de un UICollectionViewCell? (7)

A los delegados no se los llama porque los agregó dentro de la vista de colección de UIC. Los eventos táctiles están disponibles para la vista de colección que es la vista de supervisión y, por lo tanto, no se puede obtener con la vista de dentro. Es posible que tenga que pensar en otra forma de lograr este modelo.

UICollectionView tiene el mismo patrón que UITableView . El problema ocurre en la vista de tabla dentro de scrollview, que el evento táctil es aceptado por scrollview [ que es la vista de supervisión ] y para hacer que la vista de tabla sea desplazable en ese caso, el scroll de scrollview debe estar deshabilitado. Es otra versión de ese problema.

Los documentos de Apple dicen que el caso anterior genera resultados impredecibles. Por lo tanto, esto puede ser lo mismo para su problema.

En mi opinión, debes buscar un mejor diseño que pueda lograr lo que buscas.

Estoy tratando de agregar un UIScrollView dentro de un UICollectionViewCell . La idea es que puede usar el pellizco para acercar el UIScrollView (y con él, la imagen dentro), pero la vista de desplazamiento no parece manejar ningún gesto. Supongo que están siendo capturados por el UICollectionView .

He configurado el delegado de UIScrollView para que sea UICollectionViewCell , pero no se llama a ninguno de los métodos de delegado.

EDITAR: He hecho un repositorio github con el código (simplificado tanto como pude). Aunque solo son unas pocas líneas de código, no puedo ver lo que hice mal.

EDIT2: Después de que se encontró la respuesta, agregué los arreglos al repo mencionado anteriormente, espero que a otros les resulte útil también :)

https://github.com/krummler/gallery-pinchzoom-example


Acabo de realizar una implementación para SWIFT 3 en iOS 9.3+ y todo lo que hice fue:

1. Coloque la vista de la imagen dentro de una vista de desplazamiento.

2. Conecte el delegado de scrollview a la clase de celda de collectionview

3. Implemente el siguiente código en la subclase collectionview

class FullScreenImageTextDetailCollectionViewCell: UICollectionViewCell, UIScrollViewDelegate { @IBOutlet var scrollview: UIScrollView! @IBOutlet weak var backgroundImageView: UIImageView! override func awakeFromNib() { self.scrollview.minimumZoomScale = 0.5 self.scrollview.maximumZoomScale = 3.5 self.scrollview.delegate = self } func viewForZooming(in scrollView: UIScrollView) -> UIView? { return self.backgroundImageView } }

No fue necesario agregar o quitar el reconocedor de gestos en el controlador de la vista de recopilación principal, ¡funcionó de maravilla!

Gracias por los ejemplos anteriores para llegar a esto!


Agregue scrollview en su celda y su vista de imagen de celda actual agregue en scrollview. luego use el siguiente código:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { ImageContext *context = [self.images objectAtIndex:indexPath.row]; ImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"imageCell" forIndexPath:indexPath]; cell.cellScrollView.autoresizesSubviews = YES; cell.cellScrollView.multipleTouchEnabled =YES; cell.cellScrollView.maximumZoomScale = 4.0; cell.cellScrollView.minimumZoomScale = 1.0; cell.cellScrollView.clipsToBounds = YES; cell.cellScrollView.delegate = self; cell.cellScrollView.zoomScale = 1.0; [cell.imageView setImage:[UIImage imageNamed:context.thumbImageUrl]]; return cell; } -(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { NSLog(@"%i",scrollView.subviews.count); for (UIView *v in scrollView.subviews) { if ([v isKindOfClass:[UIImageView class]]) { return v; } }

}


Compruebe si todas las vistas relacionadas multitouch está activado. iOS deshabilita multitouch por defecto en la mayoría de las vistas para ahorrar energía


Es posible que desee intentar manipular los identificadores de UIGesture para hacer eso. En el GalleryViewController :

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { GalleryImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"galleryImageCell" forIndexPath:indexPath]; ImageContext *imageContext = [self.images objectAtIndex:indexPath.row]; cell.imageContext = imageContext; [self.collectionView addGestureRecognizer:cell.scrollView.pinchGestureRecognizer]; [self.collectionView addGestureRecognizer:cell.scrollView.panGestureRecognizer]; return cell; }

De la documentación de Apple en UIView :

Adjuntar un reconocedor de gestos a una vista define el alcance del gesto representado, lo que hace que reciba toques probados en esa vista y todas sus subvistas. La vista conserva el gestor de gestos.

Así que también querrás asegurarte de eliminarlos cuando la celda ya no se muestre.

- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { // Get the cell instance and ... [self.collectionView removeGestureRecognizer:cell.scrollView.pinchGestureRecognizer]; [self.collectionView removeGestureRecognizer:cell.scrollView.panGestureRecognizer]; }

Ya que no está modificando el delegado de UIGestureRecognizer, solo su alcance, todavía controlará el zoom de la vista de desplazamiento de esa celda.

EDITAR :

panGestureRecognizer a los ejemplos anteriores, siguiendo una sugerencia del OP de que era necesario. pinchGestureRecognizer maneja completamente el zoom en sí mismo, pero es cierto que en la mayoría de los casos, después de acercar una imagen a un punto donde solo es visible un subconjunto, querrá desplazarse para mover la parte visible. Es decir, es parte de una experiencia de zoom adecuada.


I''ve set the delegate of the UIScrollView to be the UICollectionViewCell, but none of the delegate methods are being called.

Para eso solo define una función en collectionViewCell

@IBOutlet weak var mainScrollView:UIScrollView! func setup(){ mainScrollView.minimumZoomScale=1 mainScrollView.maximumZoomScale=10.0 mainScrollView.delegate=self } func viewForZooming(in scrollView: UIScrollView) -> UIView? { return yourimageviewinside of scrollview }

llame a esta función en el método de collectionview de collectionview collectionview(_,cellForItem )


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if (touch.view == [self myScrollView]) //<- whatever your scrollView is called { return YES; } return NO; }

No conozca su código, pero intente jugar con el código anterior para ver si puede filtrar sus toques a los objetos que desea. El código anterior es de la referencia del protocolo UIGestureRecognizerDelegate .