2012-02-14 5 views
7

Tengo un problema interesante. Tengo un UIScrollView y dentro solo un UIImageView con imagen. Necesito esto para hacer zoom y paneo. Ok. En un botón, toque Quiero reemplazar la imagen dentro de UIImageView (que está dentro de UIScrollView, como se mencionó) con la siguiente en la línea.Cómo reemplazar correctamente la imagen en UIImageView en UIScrollView en iOS

Hasta ahora lo he hecho así:

self.imageView = nil; 
self.imageView = [[UIImageView alloc] initWithImage:nextImage]; 

La razón por la que siempre se establece self.imageView a cero es que si yo no hago eso que la siguiente imagen se escala o zoom al igual que el anterior uno fue.

Pero no creo que sea una buena solución para la eficiencia de la memoria.

¿Hay alguna otra manera de establecer una nueva imagen en UIImageView con la opción "reiniciar" para ampliar, escalar, etc.?

ACTUALIZACIÓN: El código que todavía no funciona:

[self.scrollView setZoomScale:1.0]; 
[self.imageView setImage:photoImage]; 
[self.imageView setFrame:rect]; 
[self.scrollView setContentSize:[self.imageView frame].size]; 
CGFloat minZoomScale = [self.scrollView frame].size.width/[self.imageView frame].size.width; 
if (minZoomScale < [self.scrollView frame].size.height/[self.imageView frame].size.height) { 
    minZoomScale = [self.scrollView frame].size.height/[self.imageView frame].size.height; 
} 
[self.scrollView setMinimumZoomScale:minZoomScale]; 
[self.scrollView setZoomScale:[self.scrollView minimumZoomScale]]; 

ACTUALIZACIÓN 2 Sólo di cuenta de lo que estaba haciendo mal. No reinicié la escala de zoom mínima.

[self.scrollView setMinimumZoomScale:1.0]; 

¡Ahora funciona!

Respuesta

7

hay una propiedad llamada zoomScale en UIScrollView

Set 1.0 a la zoomScale de su ScrollView. No es necesario liberar el viejo UIImageView y asignar un nuevo UIImageView cada vez. Puede establecer directamente la imagen en la vista de imagen y configurar el zoomScale de UIScrollView en 1.0.

+0

Este es la solución correcta. ¡Gracias hombre! –

+1

En realidad, esto no está funcionando. UIImageView obtiene el tamaño de la imagen anterior que es incorrecto. ¿Cómo puedo también reiniciar UIImageView? –

+1

¿Intentó configurar la imagen después de configurar 'zoomScale' en 1? – Ilanchezhian

1

Puede simplemente usar la propiedad zoomScale del objeto scrollView y configurarlo en 1.0 cada vez que cambie la imagen. Esto probablemente vaya antes de cargar la nueva imagen. De esta forma, no tendrá que asignar e iniciar un nuevo objeto UIIMageVIew cada vez que quiera cambiar solo la imagen. Además, puede poner este cambio en un bloque de animación para que la imagen no cambie nítida sino gradual.

0

Whey utiliza este código, cada vez que crea un objeto nuevo, pero UIImageView anterior permanece en su UIScrollView. Esto no es eficiente en el uso de la memoria.

Use el código siguiente:

[self.imageView removeFromSuperview]; 
[self.imageView release]; 
self.imageView = [[UIImageView alloc] initWithImage: nextImage]; 
[self addSubview: imageView]; 

o

[self.imageView setImage: nextImage]; 
[self.imageView setFrame: CGRectMake(0, 0, nextImage.size.width, nextImage.size.height)]; 

y cuando, se puede configurar el tamaño de contenido para usted ScrollView:

topScrollView.contentSize = CGSizeMake(nextImage.size.width, nextImage.size.height); 
1

Sólo quiero dejar una cosa clara, porque Me encontré con el mismo problema: restablecer la escala mínima de zoom en 1.0 antes de cambiar la imagen de la imageView:

[self.scrollView setMinimumZoomScale:1.0]; 
[self.scrollView setZoomScale:1.0]; 
[self.imageView setImage:photoImage]; 
[self.photoView setFrame:(CGRect){.origin=CGPointMake(0.0f, 0.0f), photoImage.size=photo.size}]; 
[self.scrollView setContentSize:[self.imageView frame].size]; 
CGFloat minZoomScale = MIN([self.scrollView frame].size.width/[self.imageView frame].size.width, [self.scrollView frame].size.height/[self.imageView frame].size.height) 
[self.scrollView setMinimumZoomScale:minZoomScale]; 
[self.scrollView setMaximumZoomScale:1.0]; 
[self.scrollView setZoomScale:[self.scrollView minimumZoomScale]]; 
[self centerScrollViewContents]; 

y para el centrado de la imagen:

- (void)centerScrollViewContents { 
    CGSize boundsSize = self.scrollView.bounds.size; 
    CGRect contentsFrame = self.imageView.frame; 

    if (contentsFrame.size.width < boundsSize.width) { 
     contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width)/2.0f; 
    } else { 
     contentsFrame.origin.x = 0.0f; 
    } 

    if (contentsFrame.size.height < boundsSize.height) { 
     contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height)/2.0f; 
    } else { 
     contentsFrame.origin.y = 0.0f; 
    } 

    self.imageView.frame = contentsFrame; 
} 
Cuestiones relacionadas