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]; }