用UIScrollView做一个支持两点触控缩放图片

ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIGestureRecognizerDelegate> {
    float distStart,distEnd,scale;
    UIScrollView *scrollView;
    UIImage *image;
    UIImageView *imageView;
}

@end

ViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //
    scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake((self.view.bounds.origin.x), self.view.bounds.origin.y, self.view.bounds.size.width, self.view.bounds.size.height)];
   
    [self.view addSubview:scrollView];

    image = [UIImage imageNamed:@"img.jpg"];
    imageView = [[UIImageView alloc]initWithImage:image];
    scrollView.contentSize = imageView.bounds.size;
    [scrollView addSubview:imageView];
    [scrollView setBackgroundColor:[UIColor blueColor]];
   
    UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc]
                                                
                                                 initWithTarget:self action:@selector(scale:)];
    [pinchRecognizer setDelegate:self];
    [self.view addGestureRecognizer:pinchRecognizer];
    [pinchRecognizer release];
}

-(void)scale:(id)sender {
    UIPinchGestureRecognizer* ges = (UIPinchGestureRecognizer*)sender;

    int touchCount = ges.numberOfTouches;
    if (touchCount == 2) {
        if ([ges state] == UIGestureRecognizerStateBegan) {
            CGPoint p1 = [ges locationOfTouch:0 inView:self.view];
            CGPoint p2 = [ges locationOfTouch:1 inView:self.view];
            distStart = [self distanceFromPointX:p1 distanceToPointY:p2];

        } else if ([ges state] == UIGestureRecognizerStateEnded) {
            CGPoint p1 = [ges locationOfTouch:0 inView:self.view];
            CGPoint p2 = [ges locationOfTouch:1 inView:self.view];
            distEnd = [self distanceFromPointX:p1 distanceToPointY:p2];
           
            scale = distEnd / distStart;

            float newWidth = imageView.bounds.size.width * scale;           
            float newHeight = imageView.bounds.size.height * scale;
            if (newWidth < self.view.bounds.size.width) {
                newWidth = self.view.bounds.size.width;
                newHeight = imageView.bounds.size.height/imageView.bounds.size.width * newWidth;
            }
           
            if (newHeight < self.view.bounds.size.height) {
                newHeight = self.view.bounds.size.height;
                newWidth = imageView.bounds.size.width/imageView.bounds.size.height * newHeight;
            }
            [imageView setFrame:CGRectMake(0, 0, newWidth, newHeight)];

            scrollView.contentSize = imageView.bounds.size;
            [scrollView setFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
        }       
    }
}

-(float)distanceFromPointX:(CGPoint)start distanceToPointY:(CGPoint)end{   
    float distance;   
    CGFloat xDist = (end.x - start.x);   
    CGFloat yDist = (end.y - start.y);   
    distance = sqrt((xDist * xDist) + (yDist * yDist));   
    return distance;   
}

还有一种实现方式,代码如下:

-(void)scale:(id)sender {
    UIPinchGestureRecognizer* gues = (UIPinchGestureRecognizer*)sender;
    [self.view bringSubviewToFront:[gues view]];
   
    //当手指离开屏幕时,将lastscale设置为1.0
    if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {
        lastScale = 1.0;
        return;
    }
   
    CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]);
    CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);
   
   
    [[gues view] setTransform:newTransform]; 
   
   
    lastScale = [(UIPinchGestureRecognizer*)sender scale];   
    CGRect bnds = CGRectApplyAffineTransform(gues.view.bounds, newTransform);
    [sv setContentSize:bnds.size];
    [iv setFrame:bnds];   
}

原文地址:https://www.cnblogs.com/yuanxiaoping_21cn_com/p/2687556.html