iOS手势之pinch

时间:2023-03-08 20:04:58

今天用地图的时候有用到pinch 捏合手势

通过捏合手势动作可以很轻松的来改变视图元素的一个比例

手势的动作状态有如下三种,一般是按照顺序来进行转换的。

1. UIGestureRecognizerStateBegan

2. UIGestureRecognizerStateChanged

3. UIGestureRecognizerStateEnded

一旦捏合手势动作产生了之后,我们就需要在捕获的事件中进行一个页面调整。其中有两个比较重要的变量 scale 和 velocity ,前者是一个比例范围,后者是一个变化速率的,也就是说每次变化的一个像素点。

由于 scale 这个属性的值是每次都在变的,所以我们需要用另外一个变量来保存当前的一个scale的值,这个变量叫做currentScale,这样我们就可以进行一个缩小,变大的视图效果了 。

代码:

  1. #import "ViewController.h"
  2. @interface ViewController ()
  3. @property(nonatomic, strong)UIPinchGestureRecognizer *pinchGestureRecognizer;
  4. @property(nonatomic, strong)UIView *myView;
  5. @property(nonatomic, unsafe_unretained)CGFloat currentScale;
  6. @end
  7. @implementation ViewController
  8. - (void)viewDidLoad
  9. {
  10. [super viewDidLoad];
  11. CGRect labelRect = CGRectMake(0, 0, 200, 200);
  12. self.myView= [[UIView alloc] initWithFrame:self.view.frame];
  13. self.myView.center = self.view.center;
  14. self.myView.backgroundColor = [UIColor grayColor];
  15. //打开view的交互
  16. self.myBlackLabel.userInteractionEnabled = YES;
  17. [self.view addSubview:self.myView];
  18. //创建一个手势
  19. self.pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinches:)];
  20. [self.myView addGestureRecognizer:self.pinchGestureRecognizer];
  21. }
  22. #pragma mark - 手势事件
  23. -(void)handlePinches:(UIPinchGestureRecognizer *)paramSender{
  24. if (paramSender.state == UIGestureRecognizerStateEnded) {
  25. self.currentScale = paramSender.scale;
  26. }else if(paramSender.state == UIGestureRecognizerStateBegan && self.currentScale != 0.0f){
  27. paramSender.scale = self.currentScale;
  28. }
  29. if (paramSender.scale !=NAN && paramSender.scale != 0.0) {
  30. paramSender.view.transform = CGAffineTransformMakeScale(paramSender.scale, paramSender.scale);
  31. }
  32. }
  33. - (void)didReceiveMemoryWarning
  34. {
  35. [super didReceiveMemoryWarning];
  36. // Dispose of any resources that can be recreated.
  37. }
  38. @end