2011-04-29 12 views
5

Tengo un UIImageView dentro de UIScrollView. Quiero que el usuario pueda acercar y navegar la imagen.Centrar un UIImageVer en la pantalla cuando aleje

Este es mi código de trabajo:

//img is the UIImageView 
//scroller is the UIScrollView 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
return img; 
} 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIImage *image = [UIImage imageNamed:@"map_screen.png"]; 
    img = [[UIImageView alloc] initWithImage:image]; 
    scroller.delegate = self; 
    scroller.autoresizesSubviews = YES; 
    scroller.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
    scroller.contentSize = img.frame.size; 
    scroller.scrollEnabled = YES; 
    scroller.directionalLockEnabled = NO; 
    scroller.userInteractionEnabled = YES; 

    CGSize ivsize = img.frame.size; 
    CGSize ssize = scroller.frame.size; 

    float scalex = ssize.width/ivsize.width; 
    float scaley = ssize.height/ivsize.height; 
    scroller.minimumZoomScale = fmin(1.0, fmax(scaley, scalex)); 
    scroller.zoomScale = fmin(1.0, fmax(scalex, scaley)); 
    [scroller addSubview:img]; 
    img.userInteractionEnabled = YES; 
} 

todas las obras, pero esto sucedió: el zoom mínimo es la altura de la pantalla. Mi imagen tiene un ancho mayor que la altura, por lo que quiero que el zoom mínimo sea el ancho.

si escribo

scroller.minimumZoomScale = fmin(1.0, scalex); 

obras, pero cuando el usuario se aleja, la imagen no está en el centro de la pantalla, pero en la parte superior.

he intentado algo como esto

CGPoint scrollCenter = [scroller center]; 
[img setCenter:CGPointMake(scrollCenter.x, scrollCenter.y)]; 

o

img.center = scroller.center; 

pero con esta solución, la imagen no es completamente desplazable, y si i zoom hacia fuera, que se quede de nuevo en la parte superior de la pantalla, ¡pero no es completamente visible!

¿Qué puedo hacer para solucionarlo?

Respuesta

10

Tienes que hacerlo de forma manual, mientras que el zoom está en curso utilizando la función de delegado scrollViewDidZoom ... algo así como

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 
{ 

    // center the image as it becomes smaller than the size of the screen 
    CGSize boundsSize = scrollView.bounds.size; 
    CGRect frameToCenter = imageView.frame; 

    // center horizontally 
    if (frameToCenter.size.width < boundsSize.width) 
    { 
     frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2; 
    } else { 
     frameToCenter.origin.x = 0; 
    } 

    // center vertically 
    if (frameToCenter.size.height < boundsSize.height) 
    { 
     frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2; 
    } else { 
     frameToCenter.origin.y = 0; 
    } 

    imageView.frame = frameToCenter; 

} 
+0

¡derecho! ¡funciona! ¡¡¡gracias!!! – JAA

1

Un Swift versión 3.0 de respuesta Bastian 's, un poco más sucinta:

func scrollViewDidZoom(_ scrollView: UIScrollView) { 
    // center the image as it becomes smaller than the size of the screen 
    let boundsSize = scrollView.bounds.size 
    var frameToCenter = imageView.frame 

    // center horizontally and vertically 
    let widthDiff = boundsSize.width - frameToCenter.size.width 
    let heightDiff = boundsSize.height - frameToCenter.size.height 
    frameToCenter.origin.x = (widthDiff > 0) ? widthDiff/2 : 0; 
    frameToCenter.origin.y = (heightDiff > 0) ? heightDiff/2 : 0; 

    imageView.frame = frameToCenter; 
} 
Cuestiones relacionadas