美文网首页
平移缩放区域

平移缩放区域

作者: MakeThatChange | 来源:发表于2016-11-04 15:27 被阅读62次
最近有个需求:

将一张图片放到一个UIView上,图片可以缩放,可以平移,但是必须让UIView显示图片,不能让背景露出来,这样就需要在图片将要出去的时候,限制图片的平移或缩放

一、添加平移和缩放手势到UIView
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panggesture:)];
        pan.minimumNumberOfTouches = 2;
        [self addGestureRecognizer:pan];
        
        UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
        [self addGestureRecognizer:pinch];

  • 毕竟跟手势有关,肯定都会想到用transform来实现,那么约束方面,就是判断self.x == 0, self.y ==0 , self.x + self.width == Width , self.y + self.height == Heigh。
  • 当边界条件出现的时候,我们不改变transform就可以了,让后并没有这么简单。原因是UIPinchGestureRecognizer执行他的方法是有一定时间间隔的,对于边界的约束是致命的,这样很难约束住边界,让图片停在边界。
  • 后来我利用self. transform属性有6个值(1、4控制缩放,2、3控制旋转、5、6控制平移),当平移的时候,缩放是固定的,我通过固定的缩放值,来计算需要多大的平移才能出去边界,当出去边界的时候,我设置这个边界的transform,就可以约束住图片了。

- (void)panggesture:(UIPanGestureRecognizer *)pangesture{

    // 如果没有选中东西
    
        CGPoint position = [pangesture translationInView:self];
        // xxxxx
        if (self.x > -zero + self.contentSize.width / 2.0 && self.x< zero + self.contentSize.width / 2.0) {
            if (position.x > 0) {
                return;
            }
        }
        if (self.x > zero + self.contentSize.width / 2.0) {
            self.transform = CGAffineTransformMake(self.transform.a, self.transform.b, self.transform.c, self.transform.d, self.transform.a * self.contentSize.width / 2.0 , self.transform.ty);
            [self.delegate getTransForm:self.transform];
            return;
        }
        // yyyyy
        if (self.y > -zero + self.contentSize.height / 2.0 && self.y < zero + self.contentSize.height / 2.0) {
            if (position.y > 0) {
                return;
                
            }
        }
        if (self.y > zero + self.contentSize.height / 2.0) {
            self.transform = CGAffineTransformMake(self.transform.a, self.transform.b, self.transform.c, self.transform.d,self.transform.tx, self.transform.a * self.contentSize.height/2);
            [self.delegate getTransForm:self.transform];
            
            return;
            
        }
        // width
        if (self.x + self.width <  zero + self.contentSize.width / 2.0 && self.x + self.width >  -zero + self.contentSize.width / 2.0) {
            if (position.x < 0) {
                return;
            }
            
        }
        if (self.x + self.width <  - zero + self.contentSize.width / 2.0) {
            self.transform = CGAffineTransformMake(self.transform.a, self.transform.b, self.transform.c, self.transform.d,  - self.transform.a * self.contentSize.width / 2.0 , self.transform.ty);
            
            [self.delegate getTransForm:self.transform];
            
            return;
        }
        // height
        if (self.y + self.height <   zero + self.contentSize.height / 2.0 && self.y + self.height > self.contentSize.height - zero - self.contentSize.height / 2.0) {
            if (position.y < 0) {
                return;
            }
            
        }
        if (self.y + self.height < self.contentSize.height -zero - self.contentSize.height / 2.0) {
            self.transform = CGAffineTransformMake(self.transform.a, self.transform.b, self.transform.c, self.transform.d,self.transform.tx,  - self.transform.a * self.contentSize.height / 2.0 );
            [self.delegate getTransForm:self.transform];
            return;
        }
        
        // transform
        self.transform = CGAffineTransformTranslate(self.transform, position.x, position.y);
        [self.delegate getTransForm:self.transform];
        [pangesture setTranslation:CGPointZero inView:self];

    
}

相关文章

网友评论

      本文标题:平移缩放区域

      本文链接:https://www.haomeiwen.com/subject/uwqwuttx.html