iOS小技能: 利用UIScrollView实现图片放大预览,并支持缩小。

935 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

前言

需求背景:查看收单协议长图,由于图片内容比较多和长的话,需要利用放大图片进行查看。

I 利用UIScrollView实现图片放大和缩小

1.1 UIScrollView 的缩放原理

kunnan.blog.csdn.net/article/det…

当用户在UIScrollView身上使用捏合手势时,UIScrollView会给delegate对象发送一条消息,询问delegate究竟要缩放自己内部的哪个子控件。

当用户使用捏合手势的时候,UIScrollView 会调用delegate对象的viewForZoomingInScrollView:方法,这个方法返回的控件就是需要进行缩放的控件。


- (void) scrollViewWillBeginZooming:(UIScrollView *)scrollView  withView:(UIView *)view;//准备开始缩放的时候调用
- (void)scrollViewDidZoom:(UIScrollView *)scrollView;//正在缩放的时候调用

1.2 使用方法

- (void)setupClickPic:(QCTCollectionModel*)m
{
    __weak __typeof__(self) weakSelf = self;

    
    CRMImageZoomVCViewController *detail = [[CRMImageZoomVCViewController alloc]init];
    
    CRMimgURLDto *dto =(CRMimgURLDto*) m.subModel;
    
    
    
    detail.imagePath = dto.originalAddress;
    
    
    detail.image_type = image_type_enum4url;
    
    
    
    
    
    [UIView transitionWithView:self.navigationController.view duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        
        [weakSelf.navigationController pushViewController:detail animated:NO];
        
    } completion:nil];
    
    


}


  • 可修改ZoomScale 调整最大的放大倍数
        _picScrollView.maximumZoomScale = 4.8f;

        _picScrollView.minimumZoomScale = 0.5f;//最小缩放倍数

1.3 代码实现

在这里插入图片描述

  • .h
NS_ASSUME_NONNULL_BEGIN
typedef enum : NSUInteger {
    
    image_type_enum4UIImage,
    image_type_enum4imageName,
    image_type_enum4url,
} image_type_enum;


@interface CRMImageZoomVCViewController : UIViewController

@property (nonatomic , assign) image_type_enum image_type;

@property (nonatomic , copy) NSString *chuanImageName;
@property (nonatomic , copy) NSString *leixingtype;
@property (nonatomic , copy) NSString *imagePath;
//@property (nonatomic , copy) NSString *type;
@property (nonatomic , copy) UIImage *image;



@property (nonatomic , strong) UIColor *showImgViewbackgroundColor;



@end

  • .m
//

#import "CRMImageZoomVCViewController.h"


/**
 放大和缩小图片
 */
@interface CRMImageZoomVCViewController ()
{
    CGRect _firstX;
    CGRect _firstY;
}

//     *;

@property (nonatomic, strong) UIImageView *showImgView;

@property (nonatomic, strong) UIScrollView *picScrollView;

@end

@implementation CRMImageZoomVCViewController



- (void)setShowImgViewbackgroundColor:(UIColor *)showImgViewbackgroundColor{
    
    _showImgViewbackgroundColor= showImgViewbackgroundColor;
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBarHidden = YES;
    self.view.backgroundColor = [UIColor blackColor];
    [self makeUI];
}

- (void)mainBtnDown:(UIButton*)btn
{
    [self.navigationController popViewControllerAnimated:YES];
}
//
//- (void)setMaximumZoomScale:(CGFloat)maximumZoomScale{
//    _maximumZoomScale =maximumZoomScale;
//
//    self.picScrollView.maximumZoomScale =maximumZoomScale;
//
//}
//
//- (void)setMinimumZoomScale:(CGFloat)minimumZoomScale{
//
//    _minimumZoomScale = minimumZoomScale;
//    self.picScrollView.minimumZoomScale =minimumZoomScale;
//
//}

- (UIScrollView *)picScrollView{
    if (nil == _picScrollView) {
        
       UIScrollView *tmpView  = [[UIScrollView alloc]initWithFrame:[UIScreen mainScreen].bounds];

        _picScrollView = tmpView;
        [self.navigationController.view addSubview:_picScrollView];
        
        _picScrollView.multipleTouchEnabled = YES;

        _picScrollView.maximumZoomScale = 4.8f;

        _picScrollView.minimumZoomScale = 0.5f;//最小缩放倍数
        _picScrollView.zoomScale = 1.0f;
        _picScrollView.contentSize = CGSizeMake(kWidth, kHeight);
        _picScrollView.delegate = self;
        
        UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGestureAction:)];
        _picScrollView.userInteractionEnabled = YES;
        [_picScrollView addGestureRecognizer:tapGesture];

    }
    return _picScrollView;
}

- (UIImageView *)showImgView{
    if (nil == _showImgView) {
        
//
        
        UIView *holderView = [[UIView alloc] initWithFrame:CGRectMake(0, kStatusBarHeight, kWidth, kHeight - kStatusBarHeight)];
      UIImageView *tmpView   = [[UIImageView alloc]initWithFrame:CGRectMake(0,kStatusBarHeight, holderView.frame.size.width, holderView.frame.size.height - kStatusBarHeight)];
        _showImgView = tmpView;
        
        [self.picScrollView addSubview:_showImgView];
        
        
        switch (self.image_type) {
            case image_type_enum4UIImage:
            {
                tmpView.image = _image;

            }
                break;
                
            case image_type_enum4url:
            {
//                [tmpView sd_setImageWithURL:[NSURL URLWithString:self.imagePath]];

                [tmpView sd_setImageWithURL:[NSURL URLWithString:self.imagePath] placeholderImage:[UIImage imageNamed:@"占位"]];

                
            }
                break;
            case image_type_enum4imageName:
            {
                
                tmpView.image = [UIImage imageNamed:self.imagePath];

                
            }
                break;

                
                
                
            default:
            {
                tmpView.image = _image;

            }
                break;
        }
        
        tmpView.contentMode = UIViewContentModeScaleAspectFit;

        

            
        
        


        
    }
    return _showImgView;
}

//
- (void)makeUI
{
    
    
    [self picScrollView];
    [self showImgView];
    
    

//    [_picScrollView removeFromSuperview];
//
//
//    self.picScrollView = [[UIScrollView alloc]initWithFrame:[UIScreen mainScreen].bounds];
//    self.picScrollView.multipleTouchEnabled = YES;
////    self.picScrollView.maximumZoomScale = 2.0f;
//    //ImageZoomScale
//
//    self.picScrollView.maximumZoomScale = 2.0f;
//
//    self.picScrollView.minimumZoomScale = 0.5f;//最小缩放倍数
//    self.picScrollView.zoomScale = 1.0f;
//    self.picScrollView.contentSize = CGSizeMake(kWidth, kHeight);
//    self.picScrollView.delegate = self;
//    [self.navigationController.view addSubview:_picScrollView];
//
//
//
//    UIView *holderView = [[UIView alloc] initWithFrame:CGRectMake(0, kStatusBarHeight, kWidth, kHeight - kStatusBarHeight)];
//
//    showImgView = [[UIImageView alloc]initWithFrame:CGRectMake(0,kStatusBarHeight, holderView.frame.size.width, holderView.frame.size.height - kStatusBarHeight)];
//    if (_type.length > 0) {
//        if ([_type isEqualToString:@"yes"]) {
//            [showImgView sd_setImageWithURL:[NSURL URLWithString:self.imagePath]];
//        } else {
//            showImgView.image = [UIImage imageNamed:self.imagePath];
//        }
//    } else {
//        showImgView.image = _image;
//    }
//    showImgView.contentMode = UIViewContentModeScaleAspectFit;
//    [self.picScrollView addSubview:showImgView];
//
//    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGestureAction:)];
//    self.picScrollView.userInteractionEnabled = YES;
//    [self.picScrollView addGestureRecognizer:tapGesture];
}

- (void)tapGestureAction:(UIGestureRecognizer *)gesture
{
    [_picScrollView removeFromSuperview];
    [UIView transitionWithView:self.navigationController.view duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        [self.navigationController popViewControllerAnimated:NO];
    } completion:nil];
    
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self.showImgView;
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    if (scrollView.zoomScale <= 1.0f) {
        self.showImgView.center = scrollView.center;
    }
}

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    
    
    self.navigationController.navigationBarHidden = NO;

}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.navigationController.navigationBarHidden = YES;
    
    if(self.showImgViewbackgroundColor){
        self.showImgView.backgroundColor =self.showImgViewbackgroundColor ;

    }

}

@end


II iOS小技能:查看大图浏览器(图片支持滑动切换)

blog.csdn.net/z929118967/…

see also

iOS解决压缩之后图片模糊的问题

blog.csdn.net/z929118967/…