[XTZoomPicture] iOS 对查看图片详情的封装

请支持原创, 如需转载, 请注明出处@TEASON

*说在前面: 写代码写得越久, 越发觉得有必要做总结, 总结不光是理论上的, 还包括对很多实战东西的封装, 因为确实很多东西会重复用到, 举一反三有利于节省精力, 花在学习新东西上, 编程语言发展了这么久, 最大的贡献不是哪一门语言, 而是面向对象思想, 封装,多态,继承, 重用性越高可扩展性越强的代码才值得称为框架 .
我在博客主要会围绕三个大方向写下去 :
1.知识点总结
2.问题解决方案的收集
3.开源我的框架,并以demo的形式讲解,不会面面俱到但是我会说明白思路,这是重点
好了,废话到这里, 下面

正文开始

在大多数应用的相册中都会使用类似查看图片详情的功能 .

XTZoomPicture.gif

主要功能包括了:

  1. 图片两指缩放 (缩放并设置范围的最值)
  2. 双击放大\缩小
  3. 单击还原\退出

*XTZoomPicture继承于UIScrollVIew, 可灵活用于各种环境. *直接给出地址 .
代码地址, 点我欢迎follow和star

调用方法:

  • 把文件夹XTZoomPicture里的.h,.m放入你的project
    屏幕快照 2015-12-07 下午6.57.40.png
  • controller中直接调用, 你什么都不用做.
   _zoomPictureView = [[XTZoomPicture alloc] initWithFrame:self.view.bounds
                                                 backImage:[UIImage imageNamed:@"back1"]] ;       
 [self.view addSubview:self.zoomPictureView]```

####实现分享:
  • (void)setup
    {
    [self srollviewConfigure] ; // 配置scrollview
    [self imageView] ; // 添加图片
    [self setupGesture] ; //设置手势 ,监听单击, 双击
    self.delegate = self; // 监听UIScrollViewDelegate
    }
查看UIScrollViewDelegate文档, 我们要用到的方法

@protocol UIScrollViewDelegate

  • (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView; // return a view that will be scaled. if delegate returns nil, nothing happens
并实现它

pragma mark --

pragma mark - UIScrollView Delegate

  • (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    {
    return self.imageView;
    }

如何判断区分单击和双击
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
[self addGestureRecognizer:tap];

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];
doubleTap.numberOfTapsRequired = 2 ;
[self addGestureRecognizer:doubleTap] ;
[tap requireGestureRecognizerToFail:doubleTap] ; // 必须要, 使得两个手势互相独立 
这个方法,完美处理了判断单击和双击.可查看文档中的描述

// create a relationship with another gesture recognizer that will prevent this gesture's actions from being called until otherGestureRecognizer transitions to UIGestureRecognizerStateFailed
// if otherGestureRecognizer transitions to UIGestureRecognizerStateRecognized or UIGestureRecognizerStateBegan then this recognizer will instead transition to UIGestureRecognizerStateFailed
// example usage: a single tap may require a double tap to fail

  • (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;
手势触发的方法

pragma mark - Touch Actions

  • (void)tap:(UITapGestureRecognizer *)tapGetrue
    {
    [self resetToOrigin] ; // 回到原来的大小
    [self removeFromSuperview] ;
    }

  • (void)doubleTap:(UITapGestureRecognizer *)tapGesture
    {
    if (self.zoomScale >= MAX_ZOOM) // 超过最大范围
    {
    [self setZoomScale:1 animated:YES] ;
    }
    else
    {
    CGPoint point = [tapGesture locationInView:self] ;
    // 根据点击的区域, 用zoomToRect放大
    [self zoomToRect:CGRectMake(point.x - SIDE_ZOOMTORECT / 2, point.y - SIDE_ZOOMTORECT / 2, SIDE_ZOOMTORECT, SIDE_ZOOMTORECT) animated:YES] ;
    }
    }

 如果是一组图片详情,需要在浏览之后把状态还原,故有必要把`resetToOrigin`设为**Public**
  • (void)resetToOrigin
    {
    [self setZoomScale:1 animated:NO] ;
    self.imageView.frame = [self originFrame] ;
    }

  • (CGRect)originFrame
    {
    CGRect myRect = self.bounds ;
    float flex = FLEX_SIDE ;
    return CGRectMake(0 + flex, 0 + flex, myRect.size.width - flex * 2, myRect.size.height - flex * 2) ;
    }

看到这里大家的思路应该比较明白了,主要运用`scrollview`处理`zooming`,`gesture`处理`scale`来控制缩放.
还是比较清晰的,并没有什么魔法,如果你还是不明白可以看看[源码](https://github.com/Akateason/XTZoomPicture).
如果你喜欢的话, 就在[github](https://github.com/Akateason/XTZoomPicture)加个star⭐️ .



#####预告
> 我本身有一定代码洁癖,对那些难以维护而且臃肿的`controller`比较讨厌,`MVC模式`不是什么东西都放在`controller`里面的,之后会在博客发出两篇文章并给出`demo`是对`UITableView`的两个比较精简封装和扩展, 有兴趣的朋友留意关注.

你可能感兴趣的:([XTZoomPicture] iOS 对查看图片详情的封装)