ios6 - Zoom UIImageView dentro de UIScrollView con autolayout
(3)
La mejor solución fue propuesta por Zsolt en los comentarios:
http://github.com/evgenyneu/ios-imagescroll mira esto. Funciona perfectamente para mi
La solución propuesta en este repositorio es ajustar el nivel de zoom mínimo y actual antes de mostrar la imagen:
@interface MyViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.scrollView.delegate = self;
[self initZoom];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[self initZoom];
}
// Zoom to show as much image as possible
- (void) initZoom {
float minZoom = MIN(self.view.bounds.size.width / self.imageView.image.size.width,
self.view.bounds.size.height / self.imageView.image.size.height);
if (minZoom > 1) return;
self.scrollView.minimumZoomScale = minZoom;
self.scrollView.zoomScale = minZoom;
}
- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.imageView;
}
Sin embargo, las muestras tienen problemas para alejarse. La imagen no se está centrando. Esto se puede solucionar fácilmente utilizando la clase de vista de desplazamiento personalizada con el siguiente código:
@interface MyScrollView : UIScrollView
@end
@implementation MyScrollView
-(void)layoutSubviews
{
[super layoutSubviews];
UIView* v = [self.delegate viewForZoomingInScrollView:self];
CGFloat svw = self.bounds.size.width;
CGFloat svh = self.bounds.size.height;
CGFloat vw = v.frame.size.width;
CGFloat vh = v.frame.size.height;
CGRect f = v.frame;
if (vw < svw)
f.origin.x = (svw - vw) / 2.0;
else
f.origin.x = 0;
if (vh < svh)
f.origin.y = (svh - vh) / 2.0;
else
f.origin.y = 0;
v.frame = f;
}
@end
Tengo un UIImageView incrustado dentro de UIScrollView, antes de iOS 6 y autolayout utilicé el siguiente fragmento dentro del método viedDidLoad del controlador para mostrar una imagen desplazable y con zoom.
self.scrollView.contentSize = self.imageView.image.size;
self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
Pero ahora las restricciones establecidas en el guión gráfico se usan en su lugar. He encontrado esta pregunta Insertar ImageView en ScrollView con Diseño automático en iOS 6 y algunos otros aquí en SO que indica que las restricciones se cargan / imponen después de viewDidLoad, y que mover mi fragmento anterior a viewDidAppear solucionaría este problema, pero el zoom no funciona correctamente y parece que los tamaños de scrollView y de imageView se restablecen a la restricción del guión gráfico después de un gesto de pellizcar para hacer zoom.
Solo estoy adivinando, pero creo que quizás haya alguna manera de anular las restricciones de espacio vertical y horizontal de scrollView y de imageView en el código que podría funcionar.
¿Alguien más tiene este problema?
Resolvió mi problema usando el siguiente ejemplo de código. El repositorio github corresponde al libro Programación iOS de Matt Neuburg.
También estoy de acuerdo con la sugerencia y el enlace de Zsolt.
Pero actualizo las restricciones de ancho / altura para permitirle manejar cualquier tamaño de imagen:
- (void) initZoom
{
for (NSLayoutConstraint *constraint in self.photoImageView.constraints)
{
if (constraint.firstAttribute == NSLayoutAttributeWidth)
constraint.constant = self.photoImageView.image.size.width;
else if (constraint.firstAttribute == NSLayoutAttributeHeight)
constraint.constant = self.photoImageView.image.size.height;
}
float minZoom = MIN(self.scrollView.bounds.size.width / self.photoImageView.image.size.width,
self.scrollView.bounds.size.height / self.photoImageView.image.size.height);
if (minZoom > 1) return;
self.scrollView.minimumZoomScale = minZoom;
self.scrollView.zoomScale = minZoom;
}