SkimViewController.m 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #import "SkimViewController.h"
  2. #import "UIImageView+WebCache.h"
  3. @interface SkimViewController () <UIScrollViewDelegate>
  4. {
  5. NSArray *_imageNames;
  6. NSInteger _index;
  7. UIScrollView *_scrollView;
  8. NSMutableArray *_imageViews;
  9. }
  10. @end
  11. @implementation SkimViewController
  12. - (instancetype)initWithImageNames:(NSArray *)imageNames index:(NSInteger)index
  13. {
  14. self = [super init];
  15. if (self) {
  16. _imageNames = [[NSArray alloc] initWithArray:imageNames];
  17. _index = index;
  18. }
  19. return self;
  20. }
  21. - (void)viewDidLoad {
  22. [super viewDidLoad];
  23. self.view.backgroundColor = [UIColor blackColor];
  24. [self configNavigationBar];
  25. [self createScrollView];
  26. [self creaeteImageViews];
  27. }
  28. - (void)didReceiveMemoryWarning {
  29. [super didReceiveMemoryWarning];
  30. // Dispose of any resources that can be recreated.
  31. }
  32. - (void)createScrollView
  33. {
  34. CGSize size = self.view.frame.size;
  35. _scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
  36. _scrollView.delegate = self;
  37. if (@available(iOS 11.0, *)) {
  38. _scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  39. }else {
  40. self.automaticallyAdjustsScrollViewInsets = NO;
  41. }
  42. _scrollView.pagingEnabled = YES;
  43. _scrollView.showsHorizontalScrollIndicator = NO;
  44. _scrollView.contentSize = CGSizeMake(size.width*3, size.height);
  45. _scrollView.contentOffset = CGPointMake(size.width, 0);
  46. [self.view addSubview:_scrollView];
  47. }
  48. - (void)creaeteImageViews
  49. {
  50. //创建用于保存图片视图的数组
  51. _imageViews = [[NSMutableArray alloc] init];
  52. CGSize size = _scrollView.frame.size;
  53. NSInteger count = _imageNames.count;
  54. for (NSInteger i=0; i<3; i++) {
  55. UIImageView *view = [[UIImageView alloc] initWithFrame:CGRectMake(i*size.width, 0, size.width, size.height)];
  56. view.tag = (i-1+count+_index)%count;
  57. view.contentMode = UIViewContentModeScaleAspectFit;
  58. [self setImageToView:view];
  59. if (i != 1) {
  60. //添加到滚动视图上
  61. [_scrollView addSubview:view];
  62. } else {
  63. //创建一个等大的滚动视图
  64. UIScrollView *sv = [[UIScrollView alloc] initWithFrame:view.frame];
  65. //注意 啊 大兄弟
  66. view.frame = CGRectMake(0, 0, size.width, size.height);
  67. //缩放比例
  68. sv.minimumZoomScale = 0.2;
  69. sv.maximumZoomScale = 2.0;
  70. sv.delegate = self;
  71. //手势,双击
  72. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHandle:)];
  73. [view addGestureRecognizer:tap];
  74. view.userInteractionEnabled = YES;
  75. [sv addSubview:view];
  76. [_scrollView addSubview:sv];
  77. //双击手势
  78. UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapHandle:)];
  79. doubleTap.numberOfTapsRequired = 2;
  80. //单机必须在双击手势识别失败时,才能识别
  81. [tap requireGestureRecognizerToFail:doubleTap];
  82. [view addGestureRecognizer:doubleTap];
  83. }
  84. //保存到数组中
  85. [_imageViews addObject:view];
  86. }
  87. //刷新标题
  88. [self refreshTitle];
  89. }
  90. - (void)tapHandle:(UITapGestureRecognizer *)tap
  91. {
  92. if (tap.numberOfTapsRequired == 1) {
  93. BOOL hidden = !self.navigationController.navigationBarHidden;
  94. [self.navigationController setNavigationBarHidden:hidden animated:YES];
  95. } else if (tap.numberOfTapsRequired == 2) {
  96. UIScrollView *sv = (UIScrollView *)[tap.view superview];
  97. if (sv.zoomScale != 1.0) {
  98. [sv setZoomScale:1.0 animated:YES];
  99. } else {
  100. [sv setZoomScale:sv.maximumZoomScale animated:YES];
  101. [self.navigationController setNavigationBarHidden:YES animated:YES];
  102. }
  103. }
  104. }
  105. - (void)setImageToView:(UIImageView *)view {
  106. [view sd_setImageWithURL:[NSURL URLWithString:_imageNames[view.tag][@"url"]]];
  107. }
  108. - (void)cycleReuse
  109. {
  110. CGFloat offset = _scrollView.contentOffset.x;
  111. CGFloat width = _scrollView.frame.size.width;
  112. NSInteger flag = 0;
  113. if (offset == 0) {
  114. //向右滑
  115. flag = 1;
  116. } else if (offset == 2*width) {
  117. //向左滑
  118. flag = -1;
  119. } else {
  120. return;
  121. }
  122. NSInteger count = _imageNames.count;
  123. for (UIImageView *view in _imageViews) {
  124. view.tag = (view.tag-flag+count)%count;
  125. [self setImageToView:view];
  126. }
  127. //无动画的重置偏移量
  128. _scrollView.contentOffset = CGPointMake(width, 0);
  129. //刷新标题
  130. [self refreshTitle];
  131. //恢复中间滚动视图的缩放比例1.0
  132. UIScrollView *sv = (UIScrollView *)[_imageViews[1] superview];
  133. sv.zoomScale = 1.0;
  134. }
  135. - (void)refreshTitle
  136. {
  137. self.navigationItem.title = [NSString stringWithFormat:@"%ld/%lu",[(UIView *)_imageViews[1] tag] + 1,_imageNames.count];
  138. }
  139. #pragma mark - 代理方法
  140. - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
  141. {
  142. [self cycleReuse];
  143. }
  144. #pragma mark - sv代理,不用跟_scrolview区分,因为后者没有设置比例
  145. - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
  146. {
  147. return _imageViews[1];
  148. }
  149. - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
  150. {
  151. //当缩放结束,比例小于0.5时,返回到上一页
  152. if (scale < 0.5) {
  153. //返回上一页,显示导航条
  154. if (self.navigationController.navigationBarHidden) {
  155. self.navigationController.navigationBarHidden = NO;
  156. }
  157. [self.navigationController popViewControllerAnimated:YES];
  158. }
  159. }
  160. @end