當(dāng)我們對多層圖片(由于需求決定不能將圖片合并成一張)進(jìn)行手勢處理的時(shí)候,單純的進(jìn)行拖拉、縮放、旋轉(zhuǎn)手勢不限制倍率時(shí)不會(huì)出什么問題的。但是當(dāng)我們添加的imageView上不止一個(gè)圖片的時(shí)候,添加限制就會(huì)導(dǎo)致其子視圖的圖片不跟隨手勢
首先網(wǎng)上給出的解決辦法是記錄圖片的frame:
~~//錯(cuò)誤示范(多層圖片)
//記錄其oldFrame & imageView.frame
{
CGRect oldFrame;
CGRect largeFrame;
UIImageView *img //操作的視圖
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
img.userInteractionEnabled = YES;
[self addGestureRecognizerToView:img];
oldFrame = img.frame;
largeFrame = CGRectMake(0 - ScreenWidth, 0 - ScreenHeight, 3 * oldFrame.size.width, 3 * oldFrame.size.height); //3倍放大限制
}
- (void) pinchView:(UIPinchGestureRecognizer *)pinchGestureRecognizer
{
UIView *view = pinchGestureRecognizer.view;
if (pinchGestureRecognizer.state == UIGestureRecognizerStateBegan || pinchGestureRecognizer.state == UIGestureRecognizerStateChanged) {
view.transform = CGAffineTransformScale(view.transform, pinchGestureRecognizer.scale, pinchGestureRecognizer.scale);
if (_backImage.frame.size.width <= oldFrame.size.width ) {
view.frame = oldFrame;
}
if (_backImage.frame.size.width > 3 * oldFrame.size.width) {
view.frame = largeFrame;
}
pinchGestureRecognizer.scale = 1;
}
}
~~
這個(gè)方法只會(huì)對其圖片本身進(jìn)行限制,不會(huì)限制它的子視圖,所以只能放棄。
此時(shí)只能從另一方面入手考慮,既然手勢改變的是view.transform,我們就手動(dòng)改transform。
command 點(diǎn)進(jìn)去發(fā)現(xiàn)是一個(gè)結(jié)構(gòu)體
typedef struct CGAffineTransform CGAffineTransform;
#include
#include
CF_IMPLICIT_BRIDGING_ENABLED
struct CGAffineTransform {
CGFloat a, b, c, d;
CGFloat tx, ty;
};
經(jīng)過分析發(fā)現(xiàn),我們操作view的時(shí)候其是根據(jù)transform判斷view的手勢的。所以我們可以根據(jù)transform來重置view的倍率或限制超出屏幕的大小
//記錄其imag
{
UIImageView *img //操作的視圖
CGRect oldFrame;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//after alloc your imageView or view
oldFrame = img.frame;
img.userInteractionEnabled = YES;
[self addGestureRecognizerToView:img];
}
#pragma mark - 處理所有手勢
// 正確姿勢
- (void) addGestureRecognizerToView:(UIView *)view
{
// 根據(jù)需求選擇要添加的手勢
// 旋轉(zhuǎn)手勢
UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotateView:)];
[view addGestureRecognizer:rotationGesture];
// 縮放手勢
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchView:)];
[view addGestureRecognizer:pinchGesture];
// 移動(dòng)手勢
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panView:)];
[view addGestureRecognizer:panGesture];
}
#pragma mark 處理旋轉(zhuǎn)
- (void) rotateView:(UIRotationGestureRecognizer *)rotationGesture
{
UIView *view = rotationGesture.view;
if (rotationGesture.state == UIGestureRecognizerStateBegan || rotationGesture.state == UIGestureRecognizerStateChanged) {
view.transform = CGAffineTransformRotate(view.transform, rotationGesture.rotation);
[rotationGesture setRotation:0];
//log下查看view.transform是怎么處理原理
}
}
- (void) pinchView:(UIPinchGestureRecognizer *)pinchGesture
{
UIView *view = pinchGesture.view;
if (pinchGesture.state == UIGestureRecognizerStateBegan || pinchGesture.state == UIGestureRecognizerStateChanged) {
view.transform = CGAffineTransformScale(view.transform, pinchGesture.scale, pinchGesture.scale);
if (_backImage.frame.size.width <= oldFrame.size.width ) {
[UIView beginAnimations:nil context:nil]; // 開始動(dòng)畫
[UIView setAnimationDuration:0.5f]; // 動(dòng)畫時(shí)長
/**
* 固定一倍
*/
view.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 0);
[UIView commitAnimations]; // 提交動(dòng)畫
}
if (_backImage.frame.size.width > 3 * oldFrame.size.width) {
[UIView beginAnimations:nil context:nil]; // 開始動(dòng)畫
[UIView setAnimationDuration:0.5f]; // 動(dòng)畫時(shí)長
/**
* 固定三倍
*/
view.transform = CGAffineTransformMake(3, 0, 0, 3, 0, 0);
[UIView commitAnimations]; // 提交動(dòng)畫
}
DLog(@"%@",NSStringFromCGAffineTransform(view.transform)) ;
pinchGesture.scale = 1;
}
}
#pragma mark 處理拖拉
-(void)panView:(UIPanGestureRecognizer *)panGesture
{
UIView *view = panGesture.view;
if (panGesture.state == UIGestureRecognizerStateBegan || panGesture.state == UIGestureRecognizerStateChanged) {
CGPoint translation = [panGesture translationInView:view.superview];
[view setCenter:(CGPoint){view.center.x + translation.x, view.center.y + translation.y}];
[panGesture setTranslation:CGPointZero inView:view.superview];
}
}
寫在最后:當(dāng)然如果項(xiàng)目中多次使用的話,可以給UIView添加category,或者自行進(jìn)行封裝,就不一一贅述了。
PS:如果各位大大覺得有用還請不吝惜的點(diǎn)下喜歡~