zoukankan      html  css  js  c++  java
  • UIPanGestureRecognizer中translationInView的理解

    原因是在破船大牛的blog上面看到了一个demo

    #import <UIKit/UIKit.h>

     @interface ViewController : UIViewController

    @property (weak, nonatomic) IBOutlet UITextView *textView;

     @property (weak, nonatomic) IBOutlet UIImageView *imageView;

     @property (nonatomic, assign) CGPoint gestureStartingPoint;

    @property (nonatomic, assign) CGPoint gestureStartingCenter;

    @end

    - (void)viewDidLoad

    {

        [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

        UIPanGestureRecognizer *panGes = [[UIPanGestureRecognizer alloc] initWithTarget:self

                                                                                 action:@selector(imagePanned:)];

        [self.imageView addGestureRecognizer:panGes];

        

        self.textView.textContainer.exclusionPaths = @[[self translatedBezierPath]];

        

    }

     

     

    - (UIBezierPath *)translatedBezierPath

    {

        CGRect butterflyImageRect = [self.textView convertRect:self.imageView.frame fromView:self.view];

        UIBezierPath *newButterflyPath = [UIBezierPath bezierPathWithRect:butterflyImageRect];

        

        return newButterflyPath;

    }

     

    - (void)imagePanned:(id)sender

    {

        if ([sender isKindOfClass:[UIPanGestureRecognizer class]]) {

            UIPanGestureRecognizer *localSender = sender;

            

            if (localSender.state == UIGestureRecognizerStateBegan) {

                

                self.gestureStartingPoint = [localSender translationInView:self.textView];

                self.gestureStartingCenter = self.imageView.center;

        

            } else if (localSender.state == UIGestureRecognizerStateChanged) {

                CGPoint currentPoint = [localSender translationInView:self.textView];

                

                CGFloat distanceX = currentPoint.x - self.gestureStartingPoint.x;

                CGFloat distanceY = currentPoint.y - self.gestureStartingPoint.y;

                

                CGPoint newCenter = self.gestureStartingCenter;

                

                newCenter.x += distanceX;

                newCenter.y += distanceY;

                

                self.imageView.center = newCenter;

                

                self.textView.textContainer.exclusionPaths = @[[self translatedBezierPath]];

            } else if (localSender.state == UIGestureRecognizerStateEnded) {

                self.gestureStartingPoint = CGPointZero;

                self.gestureStartingCenter = CGPointZero;

            }

        }

    }

     

    看到了translationInView方法不明白是怎么回事,就看了一下官方文档解释是:

    - (CGPoint)translationInView:(UIView *)view方法的API解释如下:

     The translation of the pan gesture in the coordinate system of the specified view.

     Return Value

    A point identifying the new location of a view in the coordinate system of its designated superview.

    字面理解是:

    在指定的视图坐标系统中转换(拖动?) pan gesture

    返回参数:返回一个明确的新的坐标位置,在指定的父视图坐标系统中

    我理解为

    该方法返回在横坐标上、纵坐标上拖动了多少像素。

  • 相关阅读:
    PHP7放弃大礼包(微信支付回调签名错误)
    PHP CURL中传递cookie的方法
    php-5.3源码编译autoconf版本不符合解法
    单例模式使用小介绍
    centos源码编译安装nginx过程记录
    PHP语言开发Paypal支付demo的具体实现
    Redis安全与持久化(适合小白阅读)
    mac当你有多个版本的命令存在是怎么使用最新版本
    设置让php能够以root权限来执行exec() 或者 shell_exec()
    git冲突解决
  • 原文地址:https://www.cnblogs.com/sanjianghuiliu/p/3957476.html
Copyright © 2011-2022 走看看