How can I zoom in or out in a UIImageView without a UIScrollView?

I am developing an application for iOS 4.2, iPhone, in this application I upload images and save them in the internal storage (NSDocuments).

Ok, then I show the first image in a UIImageView. User can drag the finger to UIImageView (TouchesMoved), when the user does this, I upload another image. If the user drags down, I upload one image, if I drag it, I load another, as well as right and left.

All this is done. But I want to implement scaling. This is my code so far:

initialDistance โ†’ the distance between the fingers at the first touch
finalDistance โ†’ the distance between the fingers every time they move
x โ†’ 0 y โ†’ 0 -

// this method calculate the distance between 2 fingers - (CGFloat)distanceBetweenTwoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint { float xPoint = toPoint.x - fromPoint.x; float yPoint = toPoint.y - fromPoint.y; return sqrt(xPoint * xPoint + yPoint * yPoint); } //------------------- Movimientos con los dedos ------------------------------------ #pragma mark - #pragma mark UIResponder // First Touch -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ NSSet *allTouches = [event allTouches]; switch ([allTouches count]) { case 1: { //Single touch //Get the first touch. UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0]; switch ([touch1 tapCount]) { case 1: //Single Tap. { // Guardo la primera localizaciรณn del dedo cuando pulsa por primera vez //inicial = [touch1 locationInView:self.view]; } break; case 2: {//Double tap. //Track the initial distance between two fingers. //if ([[allTouches allObjects] count] >= 2) { // oculto/o no, la barra de arriba cuando se hace un dobleTap //[self switchToolBar]; } break; } } break; case 2: { //Double Touch // calculo la distancia inicial que hay entre los dedos cuando empieza a tocar UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0]; UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1]; initialDistance = [self distanceBetweenTwoPoints:[touch1 locationInView:[self view]] toPoint:[touch2 locationInView:[self view]]]; } default: break; } } // when the finger/s move to -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSSet *allTouches = [event allTouches]; switch ([allTouches count]) { case 1: { } break; case 2: { //The image is being zoomed in or out. UITouch *touch1 = [[allTouches allObjects] objectAtIndex:0]; UITouch *touch2 = [[allTouches allObjects] objectAtIndex:1]; //Calculate the distance between the two fingers. CGFloat finalDistance = [self distanceBetweenTwoPoints:[touch1 locationInView:[self view]] toPoint:[touch2 locationInView:[self view]]]; NSLog(@"Distancia Inicial :: %.f, Ditancia final :: %.f", initialDistance, finalDistance); float factorX = 20.0; float factorY = 11.0; // guardo la posicion de los 2 dedos //CGPoint dedo1 = [[[touches allObjects] objectAtIndex:0] locationInView:self.view]; //CGPoint dedo2 = [[[touches allObjects] objectAtIndex:1] locationInView:self.view]; // comparo para saber si el usuario esta haciendo zoom in o zoom out if(initialDistance < finalDistance) { NSLog(@"Zoom In"); float newWidth = imagen.frame.size.width + (initialDistance - finalDistance + factorX); float newHeight = imagen.frame.size.height + (initialDistance - finalDistance + factorY); if (newWidth <= 960 && newHeight <= 640) { /* if (dedo1.x >= dedo2.x) { x = (dedo1.x + finalDistance/2); y = (dedo1.y + finalDistance/2); } else { x = (dedo2.x + finalDistance/2); y = (dedo2.y + finalDistance/2); } */ //x = (dedo1.x); //y = (dedo1.y); imagen.frame = CGRectMake( x, y, newWidth, newHeight); } else { imagen.frame = CGRectMake( x, y, 960, 640); } } else { NSLog(@"Zoom Out"); float newWidth = imagen.frame.size.width - (finalDistance - initialDistance + factorX); float newHeight = imagen.frame.size.height - (finalDistance - initialDistance + factorY); if (newWidth >= 480 && newHeight >= 320) { /* if (dedo1.x >= dedo2.x) { x = (dedo1.x + finalDistance/2); y = (dedo1.y + finalDistance/2); } else { x = (dedo2.x + finalDistance/2); y = (dedo2.y + finalDistance/2); } */ //x -= (finalDistance - initialDistance + factorX); //y -= (finalDistance - initialDistance + factorX); //x = (dedo1.x); //y = (dedo1.y); imagen.frame = CGRectMake( x, y, newWidth, newHeight); } else { imagen.frame = CGRectMake( 0, 0, 480, 320); } } initialDistance = finalDistance; } break; } } #pragma mark - 

Many thanks!

PD: If there is a method with a UIScrollView whitch, I can move between different images, I also open my eyes to take a look too.

+6
source share
2 answers

Ok You can use UIScrollView if you only use it for your zoom function.

Let's say that we have scrollView and a imageView , both of which have the same borders. Add imageView as a scrollView .

 [scrollView addSubview:imageView]; scrollView.contentSize = imageView.frame.size; 

To support only scaling and not panning in scrollView , your viewController will need to accept the UIScrollViewDelegate protocol.

 // Disabling panning/scrolling in the scrollView scrollView.scrollEnabled = NO; // For supporting zoom, scrollView.minimumZoomScale = 0.5; scrollView.maximumZoomScale = 2.0; ... // Implement a single scroll view delegate method - (UIView*)viewForZoomingInScrollView:(UIScrollView *)aScrollView { return imageView; } 

Scaling is currently available. For checks, you can use the appropriately configured UISwipeGestureRecognizers . Create a gesture to handle each direction of motion and add it to the scroll mode.

 UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self selector:@selector(handleRightSwipe:)]; rightSwipe.direction = UISwipeGestureRecognizerDirectionRight; rightSwipe.numberOfTouchesRequired = 1; [scrollView addGesture:rightSwipe]; [rightSwipe release]; 

And get the corresponding image on the basis of the sign and install it using imageView.image = yourImage; .

+21
source

Finally, using Deepak help, I use the UIImageView transform property to create Scaling.

I use CGFloat at position [0,0] in the CGAffineTransform matrix to set limits. I need to pass CGFloat to a string when scaling, because when I compare it to 0, this is always true.

Finally, this is my code in touchsMoved if it is useful to someone:

 // comparo para saber si el usuario esta haciendo zoom in o zoom out if(initialDistance < finalDistance) { NSLog(@"Zoom Out"); CGAffineTransform transformer = CGAffineTransformScale(imagen.transform, 1.05, 1.05); NSLog(@"transformer :: A: %.f, B: %.f, C: %.f, D: %.f", imagen.transform.a, imagen.transform.b, imagen.transform.c, imagen.transform.d); if (transformer.a < 5) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration: 0.2]; imagen.transform = transformer; [UIView setAnimationDelegate:self]; [UIView commitAnimations]; } } else { NSLog(@"Zoom In"); CGAffineTransform transformer = CGAffineTransformScale(imagen.transform, 0.95, 0.95); NSLog(@"transformer :: A: %.f, B: %.f, C: %.f, D: %.f", transformer.a, transformer.b, transformer.c, transformer.d); NSString *num = [NSString stringWithFormat:@"%.f", transformer.a]; if (![num isEqualToString:@"0"]) { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration: 0.2]; imagen.transform = transformer; [UIView setAnimationDelegate:self]; [UIView commitAnimations]; } } 

And, of course, many thanks to Deepak.

+3
source

Source: https://habr.com/ru/post/888448/


All Articles