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