请支持原创, 如需转载, 请注明出处@TEASON
*说在前面: 写代码写得越久, 越发觉得有必要做总结, 总结不光是理论上的, 还包括对很多实战东西的封装, 因为确实很多东西会重复用到, 举一反三有利于节省精力, 花在学习新东西上, 编程语言发展了这么久, 最大的贡献不是哪一门语言, 而是面向对象思想, 封装,多态,继承, 重用性越高可扩展性越强的代码才值得称为框架 .
我在博客主要会围绕三个大方向写下去 :
1.知识点总结
2.问题解决方案的收集
3.开源我的框架,并以demo的形式讲解,不会面面俱到但是我会说明白思路,这是重点
好了,废话到这里, 下面
正文开始
在大多数应用的相册中都会使用类似查看图片详情的功能 .
主要功能包括了:
- 图片两指缩放 (缩放并设置范围的最值)
- 双击放大\缩小
- 单击还原\退出
*XTZoomPicture
继承于UIScrollVIew
, 可灵活用于各种环境. *直接给出地址 .
代码地址, 点我欢迎follow和star
调用方法:
- 把文件夹
XTZoomPicture
里的.h
,.m
放入你的project
- 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`的两个比较精简封装和扩展, 有兴趣的朋友留意关注.