最近有个需求:
将一张图片放到一个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];
}