2012-01-17 19 views
23

¿De verdad necesito un UIPinchGestureRecognizer dentro de UIScrollView para que funcione el pinch? Si es así, ¿cómo lo hago? Estoy tratando de implementar lo que flipboard tiene, donde básicamente hace un acercamiento de una imagen y tiene la capacidad de desplazamiento después de hacer zoom. ¿Cómo hago eso?UIImageView y UIScrollView zooming

ACTUALIZACIÓN:

Aquí hay un código que tengo que no llame a la vista de desplazamiento delegado

CGRect imgFrame; 
imgFrame.size.width = originalImageSize.width; 
imgFrame.size.height = originalImageSize.height; 
imgFrame.origin.x = imageOriginPoint.x; 
imgFrame.origin.y = imageOriginPoint.y; 

NSData *data = [request responseData]; 
UIImage * image = [UIImage imageWithData:data]; 
imageView = [[UIImageView alloc] initWithImage:image]; 
[imageView setUserInteractionEnabled:YES]; 
[imageView setBackgroundColor:[UIColor clearColor]]; 
[imageView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; 
[imageView setFrame:CGRectMake(0, 0, imgFrame.size.width, imgFrame.size.height)]; 

UIScrollView * imgScrollView = [[UIScrollView alloc] initWithFrame:imageView.frame]; 
imgScrollView.delegate = self; 
imgScrollView.showsVerticalScrollIndicator = NO; 
imgScrollView.showsHorizontalScrollIndicator = NO; 
[imgScrollView setScrollEnabled:YES]; 
[imgScrollView setClipsToBounds:YES]; 
[imgScrollView addSubview:imageView]; 
[imgScrollView setBackgroundColor:[UIColor blueColor]]; 
[imgScrollView setMaximumZoomScale:1.0]; 

Respuesta

79

Todo lo que necesita hacer es añadir sus UIImageView (o cualquier vista que desea ampliar) dentro de su UIScrollView.

Configure su maximumZoomScale en su UIScrollView a cualquier valor superior a 1.0f.

Establecer a sí mismo como el delegado de su UIScrollView y regresar el UIImageView en el método delegado viewForZooming.

Eso es todo. No es necesario un gesto de pellizco, no hay nada. UIScrollView maneja pellizcar zoom para usted.

+0

sí, hice todo eso, pero el delegado no se llama – adit

+0

aha! ¡No configuré maxZoomScale y, por lo tanto, no funcionó! gracias – adit

+0

Ignacio, por favor, ¿puedes decir las limitaciones en imageView y scrollView. Hice lo mismo, pero no está funcionando. La vista de mi imagen está configurada en relleno de aspecto y el ancho está fuera del marco de visualización de la imagen, así que necesito aumentar el marco de la vista de la imagen, así como el ancho del ancho del contenido de la vista de desplazamiento. Tengo solo una imagen en mi vista de desplazamiento –

2

Cuando estaba desarrollando mi visor de zoom PDF en un UIScrollView descubrí que cuando ejecutarlo en el teléfono ya tiene el zoom implementado como parte del teléfono. Pero podría echarle un vistazo a esto, http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html, es una pieza de código de muestra que intenta implementar la funcionalidad para ampliar, esto es lo que quiero es comenzar.

+0

De hecho, me miré en ese y dice que necesitaré un delegado pidió viewForZoomingInScrollView, sin embargo esto no se llama nunca a pesar de que ya ha configurado el delegado a la libre – adit

+1

Como @Novarg hassaid que es llamado por el UIScrollViewDelegate por lo que en su archivo .h asegúrese de agregar Popeye

+0

Lo agregué y todavía no se llama – adit

14

Hice un visor de imágenes personalizado no hace mucho tiempo sin los reconocedores de pellizco. Solo UIImageView en la parte superior de UIScrollView. Allí pasas una cadena con un enlace a la imagen y también tiene una barra de progreso. Una vez que la imagen termina de cargar, se muestra la imagen. Aquí está el código:

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return self.theImageView; 
} 

- (CGRect)centeredFrameForScrollView:(UIScrollView *)scroll andUIView:(UIView *)rView { 
    CGSize boundsSize = scroll.bounds.size; 
    CGRect frameToCenter = rView.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; 
    } 
    return frameToCenter; 
} 

-(void)scrollViewDidZoom:(UIScrollView *)scrollView 
{ 
    self.theImageView.frame = [self centeredFrameForScrollView:self.theScrollView andUIView:self.theImageView];        
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [self.resourceData setLength:0]; 
    self.filesize = [NSNumber numberWithLongLong:[response expectedContentLength]]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [self.resourceData appendData:data]; 
    NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[self.resourceData length]]; 
    self.progressBar.progress = [resourceLength floatValue]/[self.filesize floatValue]; 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    self.theImage = [[UIImage alloc]initWithData:resourceData]; 
    self.theImageView.frame = CGRectMake(0, 0, self.theImage.size.width, self.theImage.size.height); 
    self.theImageView.image = self.theImage; 
    self.theScrollView.minimumZoomScale = self.theScrollView.frame.size.width/self.theImageView.frame.size.width; 
    self.theScrollView.maximumZoomScale = 2.0; 
    [self.theScrollView setZoomScale:self.theScrollView.minimumZoomScale]; 
    self.theScrollView.contentSize = self.theImageView.frame.size; 
    self.theLabel.hidden = YES; 
    self.progressBar.hidden = YES; 
} 

-(void)setImageInImageView 
{ 
    NSURLRequest *req = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:self.imageLink]]; 
    NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:req delegate:self]; 
    if (conn) 
    { 
    self.resourceData = [NSMutableData data]; 
    } 
    else 
    { 
    NSLog(@"Connection failed: IMageViewerViewController"); 
    } 
} 

-(void)loadView 
{ 
    self.filesize = [[NSNumber alloc]init]; 
    self.progressBar = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar]; 
    self.progressBar.frame = CGRectMake(20, 240, 280, 40); 
    [self.progressBar setProgress:0.0]; 
    self.theImageView = [[[UIImageView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame]]autorelease]; 
    self.theScrollView = [[[UIScrollView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame]]autorelease]; 
    self.theScrollView.delegate = self; 
    [self.theScrollView addSubview:self.theImageView]; 
    self.view = self.theScrollView; 
    self.theLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 200, 320, 40)]; 
    self.theLabel.font = [UIFont boldSystemFontOfSize:15.0f]; 
    self.theLabel.text = @"Please wait, file is being downloaded"; 
    self.theLabel.textAlignment = UITextAlignmentCenter; 
    self.theLabel.hidden = NO; 
    [self.view addSubview:self.progressBar]; 
    [self.view bringSubviewToFront:self.progressBar]; 
    [self.view addSubview:self.theLabel]; 
    [self.view bringSubviewToFront:self. theLabel]; 
    [self performSelectorOnMainThread:@selector(setImageInImageView) withObject:nil waitUntilDone:NO]; 
} 

Y el archivo de cabecera:

@interface ImageViewerViewController : UIViewController<UIScrollViewDelegate, NSURLConnectionDelegate, NSURLConnectionDataDelegate> 

@property (nonatomic, retain) IBOutlet UIImageView *theImageView; 
@property (nonatomic, retain) IBOutlet UIScrollView *theScrollView; 
@property (nonatomic, retain) NSString *imageLink; 
@property (nonatomic, retain) UIImage *theImage; 
@property (nonatomic, retain) UILabel *theLabel; 
@property (nonatomic, retain) UIProgressView *progressBar; 
@property (nonatomic, retain) NSMutableData *resourceData; 
@property (nonatomic, retain) NSNumber *filesize; 
@end 

creo que sirve

+0

¿sabe por qué ese viewForZoomingInScrollView nunca se llama? – adit

+0

@adit es llamado por UIScrollViewDelegate Creo que – Novarg

+0

@adit lo hizo funcionar? ¿O tienes alguna otra pregunta? – Novarg

9

supongo que esta respuesta puede ser innecesario, pero he tenido problemas similares a @adit y resuelto de una manera muy simple (creo) y tal vez alguien con problemas similares puede utilizarlo:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor yellowColor]; 

    UIImage *imageToLoad = [UIImage imageNamed:@"background_green"]; 

    self.myImageView = [[UIImageView alloc]initWithImage:imageToLoad]; 
    self.myScrollView = [[UIScrollView alloc]initWithFrame:self.view.bounds]; 
    [self.myScrollView addSubview:self.myImageView]; 
    self.myScrollView.contentSize = self.myImageView.bounds.size; 
    self.myScrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; 
    self.myScrollView.minimumZoomScale = 0.3f; 
    self.myScrollView.maximumZoomScale = 3.0f; 
    self.myScrollView.delegate = self; 
    [self.view addSubview:self.myScrollView]; 
} 

- (UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    NSLog(@"viewForZoomingInScrollView"); 
    return self.myImageView; 
} 

Mi El problema fue muy simple. Me olvidé de agregar self.myScrollView.delegate = self;, que fue la razón por la que tuve problemas. Me llevó siglos para darse cuenta de eso simple problema, supongo que no vi el bosque para todos los árboles :-)

13

Swift 2.0 Pinch-zoom de imagen en ScrollView Pasos (Swift 2.0)

1. Vaya Ver Restricciones

enter image description here

2.Añadir ImageView En ScrollView y SET

enter image description here

3. Tomar IBOutlets

IBOutlet UIScrollView * bgScrollView; 
IBOutlet UIImageView * imageViewOutlet; 

4. Método viewDidLoad

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    float minScale=bgScrollView.frame.size.width/imageViewOutlet.frame.size.width; 
    bgScrollView.minimumZoomScale = minScale; 
    bgScrollView.maximumZoomScale = 3.0; 
    bgScrollView.contentSize = imageViewOutlet.frame.size; 
    bgScrollView.delegate = self; 
} 

5. Vaya Ver Delegado Método

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return imageViewOutlet; 
} 
Cuestiones relacionadas