【IOS】使用手势对UIImageView进行缩放、旋转和移动

来源:互联网 发布:什么软件看火影 编辑:程序博客网 时间:2024/05/04 17:14
因为项目需要,需要对图片进行一些操作。本着拿来主义的原则~上网找了方法。

但是发现网上很多实现,要么过于复杂,要么不够完善。

终于找到一篇比较好的文章。

参考文章: http://apluck.iteye.com/blog/1781607

代码:

[cpp] view plaincopy
  1. // 添加所有的手势  
  2. - (void) addGestureRecognizerToView:(UIView *)view  
  3. {  
  4.     // 旋转手势  
  5.     UIRotationGestureRecognizer *rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotateView:)];  
  6.     [view addGestureRecognizer:rotationGestureRecognizer];  
  7.       
  8.     // 缩放手势  
  9.     UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchView:)];  
  10.     [view addGestureRecognizer:pinchGestureRecognizer];  
  11.       
  12.     // 移动手势  
  13.     UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panView:)];  
  14.     [view addGestureRecognizer:panGestureRecognizer];  
  15. }  
  16.   
  17. // 处理旋转手势  
  18. - (void) rotateView:(UIRotationGestureRecognizer *)rotationGestureRecognizer  
  19. {  
  20.     UIView *view = rotationGestureRecognizer.view;  
  21.     if (rotationGestureRecognizer.state == UIGestureRecognizerStateBegan || rotationGestureRecognizer.state == UIGestureRecognizerStateChanged) {  
  22.         view.transform = CGAffineTransformRotate(view.transform, rotationGestureRecognizer.rotation);  
  23.         [rotationGestureRecognizer setRotation:0];  
  24.     }  
  25. }  
  26.   
  27. // 处理缩放手势  
  28. - (void) pinchView:(UIPinchGestureRecognizer *)pinchGestureRecognizer  
  29. {  
  30.     UIView *view = pinchGestureRecognizer.view;  
  31.     if (pinchGestureRecognizer.state == UIGestureRecognizerStateBegan || pinchGestureRecognizer.state == UIGestureRecognizerStateChanged) {  
  32.         view.transform = CGAffineTransformScale(view.transform, pinchGestureRecognizer.scale, pinchGestureRecognizer.scale);  
  33.         pinchGestureRecognizer.scale = 1;  
  34.     }  
  35. }  
  36.   
  37. // 处理拖拉手势  
  38. - (void) panView:(UIPanGestureRecognizer *)panGestureRecognizer  
  39. {  
  40.     UIView *view = panGestureRecognizer.view;  
  41.     if (panGestureRecognizer.state == UIGestureRecognizerStateBegan || panGestureRecognizer.state == UIGestureRecognizerStateChanged) {  
  42.         CGPoint translation = [panGestureRecognizer translationInView:view.superview];  
  43.         [view setCenter:(CGPoint){view.center.x + translation.x, view.center.y + translation.y}];  
  44.         [panGestureRecognizer setTranslation:CGPointZero inView:view.superview];  
  45.     }  
  46. }  

这样只需要简单调用

[cpp] view plaincopy
  1. [self addGestureRecognizerToView:view];    
  2.    
  3. //如果处理的是图片,别忘了  
  4. [imageView setUserInteractionEnabled:YES];    
  5. [imageView setMultipleTouchEnabled:YES];   

大功告成。


具体使用一下:

在.h文件里边定义变量

[cpp] view plaincopy
  1. @interface YourViewController : UIViewController<UIGestureRecognizerDelegate>  
  2. {  
  3.     CGFloat lastScale;  
  4.     CGRect oldFrame;    //保存图片原来的大小  
  5.     CGRect largeFrame;  //确定图片放大最大的程度  
  6. }  

然后在viewDidLoad里面加上

[cpp] view plaincopy
  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.   
  5.     showImgView = [[UIImageView alloc] initWithFrame:<span class="s1">CGRectMake</span>(<span class="s2">0</span>, <span class="s2">0</span>, 320, 480)];  
  6.     [showImgView setMultipleTouchEnabled:YES];  
  7.     [showImgView setUserInteractionEnabled:YES];  
  8.     [showImgView setImage:[UIImage imageNamed:@"1.jpg"]];  
  9.       
  10.     oldFrame = showImgView.frame;  
  11.     largeFrame = CGRectMake(0 - screenSize.width, 0 - screenSize.height, 3 * oldFrame.size.width, 3 * oldFrame.size.height);  
  12.       
  13.     [self addGestureRecognizerToView:showImgView];  
  14.     [self.view addSubview:showImgView];  

这样就实现了

但是,这样是不够的。

因为里边的缩放和移动等没有做相应的判断。

因为代码很简洁,所以扩展也非常方便。


我修改了缩放的代码,增加了限制,其他的类似

[cpp] view plaincopy
  1. // 处理缩放手势  
  2. - (void) pinchView:(UIPinchGestureRecognizer *)pinchGestureRecognizer  
  3. {  
  4.     UIView *view = pinchGestureRecognizer.view;  
  5.     if (pinchGestureRecognizer.state == UIGestureRecognizerStateBegan || pinchGestureRecognizer.state == UIGestureRecognizerStateChanged) {  
  6.         view.transform = CGAffineTransformScale(view.transform, pinchGestureRecognizer.scale, pinchGestureRecognizer.scale);  
  7.         if (showImgView.frame.size.width < oldFrame.size.width) {  
  8.             showImgView.frame = oldFrame;  
  9.             //让图片无法缩得比原图小  
  10.         }  
  11.         if (showImgView.frame.size.width > 3 * oldFrame.size.width) {  
  12.             showImgView.frame = largeFrame;  
  13.         }  
  14.         pinchGestureRecognizer.scale = 1;  
  15.     }  
  16. }  

这样就好了。保证了图片的最大和最小比例。
0 0