一、应用场景

类似微信发朋友圈添加图片(相册或拍照),点击图片可以浏览,浏览时可对当前图片进行缩放,并且该缩放不影响其他图片正常显示;浏览时可删除图片

二、关键代码

//这里主要的问题是:如果采用CGAffineTransformScale对scrollview进行缩放,则浏览时移到下一张图片也会跟着缩放;如果捏合手势添加到scrollview的imageview中,同样采用CGAffineTransformScale对该图片缩放(pinGes.view.transform = CGAffineTransformScale(self.scrollView.transform, newScale, newScale);)并没有效果;

//因此,采用的策略是:在scrollview中嵌套scrollview,然后再嵌套imageview,并且采用zoomToRect缩放,而非CGAffineTransformScale

- (void)cuLayoutSubViews
{
    BL_LoadNavHeight;
    self.scrollView = [[UIScrollView alloc] initWith :CGRectMake(0, 0, ScreenWidth_N(), ScreenHeight_N())];
    self.scrollView.backgroundColor = [UIColor blackColor];
    [self.view addSubview:self.scrollView];
    
    self.scrollView.delegate = self;
    self.scrollView.pagingEnabled = YES;
    self.scrollView.scrollEnabled = YES;
    self.scrollView.showsHorizontalScrollIndicator = NO;
    
    [self.imageArr enumerate sUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        UIScrollView *subScrollView = [[UIScrollView alloc] initWith :CGRectMake(idx*ScreenWidth_N(), navViewH, ScreenWidth_N(), ScreenHeight_N()-navViewH)];
        subScrollView.backgroundColor = [UIColor blackColor];
        subScrollView.contentSize = CGSizeMake(ScreenWidth_N(), ScreenHeight_N()-navViewH);
        subScrollView.delegate = self;
        subScrollView.minimumZoomScale = self.minScale;
        subScrollView.maximumZoomScale = self.maxScale;
        [subScrollView setZoomScale:1.0];
        
        UIImage *img = (UIImage *)obj;
        UIImageView *imgView = [[UIImageView alloc] initWith :CGRectMake(0, 0, ScreenWidth_N(), ScreenHeight_N()-navViewH)];
        imgView.userInteractionEnabled = YES;
        imgView.contentMode = UIViewContentModeScaleAspectFit;
        imgView.image = img;
        
        UIPinchGestureRecognizer *pin = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinGesClick:)];
        //捏合手势
        [imgView addGestureRecognizer:pin];
        [subScrollView addSubview:imgView];
        [self.scrollView addSubview:subScrollView];
        
        [self.subScrollViewArr add :subScrollView];
        [self.imgViewArr add :imgView];
        
    }];
    
    [self adjustScrollViewOffset];
    
    //    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(navHidden)];
    //    [self.scrollView addGestureRecognizer:tap];
}

 

- (void)pinGesClick:(UIPinchGestureRecognizer *)pinGes
{
//    switch (pinGes.state) {
//        case UIGestureRecognizerStateBegan://scale began
//        case UIGestureRecognizerStateChanged://scale changed
//        {
//            CGFloat currentScale = [[self.scrollView.  valueForKeyPath:@\"transform.scale\"] floatValue];
//            CGFloat newScale = pinGes.scale - self.lastScale + 1;
//
//            newScale = MIN(newScale, self.maxScale / currentScale);
//            newScale = MAX(newScale, self.minScale / currentScale);
//
//            self.scrollView.transform = CGAffineTransformScale(self.scrollView.transform, newScale, newScale);
//
//            for (int i = 0; i < self.imgViewArr.count; i++) {
//                UIImageView *subImgView = self.imgViewArr[i];
//                NSLog(@\"subImgView----%d---%@\", i, subImgView);
//            }
//
//            self.lastScale = pinGes.scale;
//
//
//        }
//            break;
//        case UIGestureRecognizerStateEnded://scale ended
//            self.lastScale = 1;
//            break;
//        default:
//            break;
//    }

    float newScale = [(UIScrollView*)pinGes.view.superview zoomScale];
    CGRect zoomRect = [self zoomRectForScale:newScale  inView:(UIScrollView*)pinGes.view.superview withCenter:[pinGes locationInView:pinGes.view]];
    [(UIScrollView*)pinGes.view.superview zoomToRect:zoomRect animated:YES];
}

 

//必须返回当前缩放视图——实现代理方法

//放回当前缩放图片
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    for (UIView *v in scrollView.subviews){
        return v;
    }
    return nil;
}

 

三、效果

\"\"

\"\"

\"\"

 

GitHub

收藏 打印