iOS多層圖片(view)拖拉、縮放手勢(限制放大縮小倍數(shù))處理

當(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)下喜歡~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容