SPSBAdvertisementBannerScrollView.m 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. //
  2. // SPSBAdvertisementBannerScrollView.m
  3. // 我的社保
  4. //
  5. // Created by shanp on 2021/5/10.
  6. //
  7. #import "SPSBAdvertisementBannerScrollView.h"
  8. #import "SPSBUIGeneralHeader.h"
  9. @interface SPSBAdvertisementBannerScrollView ()<UIScrollViewDelegate> {
  10. NSInteger _pageCount;
  11. NSArray<UIImage *> *_imageArray;
  12. UIView *_pageControlView;
  13. UIView *_pageControlFlag;
  14. CGFloat _scrollViewWidth;
  15. UIScrollView *_imageScrollView;
  16. NSTimer *_timer;
  17. }
  18. @end
  19. #define leadingInterval 16
  20. @implementation SPSBAdvertisementBannerScrollView
  21. - (instancetype)init {
  22. self = [super init];
  23. if (!self) return nil;
  24. _pageCount = 0;
  25. _scrollViewWidth = jxh_screenWidth() - leadingInterval * 2;
  26. [self addImageView];
  27. [self addPageControl];
  28. [self addTimer];
  29. _imageScrollView.contentOffset = CGPointMake(_scrollViewWidth, _imageScrollView.contentOffset.y);
  30. return self;
  31. }
  32. - (void)addImageView {
  33. if (_imageScrollView) [_imageScrollView removeFromSuperview];
  34. if (_pageCount == 0) return;
  35. UIImage *image = _imageArray[0];
  36. _spsb_height = _scrollViewWidth * (image.size.height / image.size.width);
  37. _imageScrollView = [UIScrollView convenienceWithBackgroundColor:spsb_FFFFFF_color(1.f)];
  38. _imageScrollView.scrollsToTop = false;
  39. _imageScrollView.delegate = self;
  40. _imageScrollView.pagingEnabled = true;
  41. [self addSubview:_imageScrollView];
  42. //添加显示的图片
  43. for (NSInteger i = 1; i < _pageCount + 1; i ++) {
  44. UIImageView *imageView = UIImageView.new;
  45. imageView.contentMode = UIViewContentModeScaleAspectFill;
  46. imageView.clipsToBounds = true;
  47. imageView.tag = 2000 + i;
  48. imageView.backgroundColor = [UIColor whiteColor];
  49. if (_imageArray && _imageArray.count > i - 1) {
  50. imageView.image = _imageArray[i - 1];
  51. }
  52. [_imageScrollView addSubview:imageView];
  53. if (i == _pageCount) {
  54. [imageView makeConstraints:^(JXHConstraintMaker *make) {
  55. make.leading.equalTo(i * self->_scrollViewWidth);
  56. make.top.equalTo(0);
  57. make.size.equalTo(CGSizeMake(self->_scrollViewWidth, self->_spsb_height));
  58. make.trailing.equalTo(-self->_scrollViewWidth);
  59. }];
  60. } else {
  61. [imageView makeConstraints:^(JXHConstraintMaker *make) {
  62. make.leading.equalTo(i * self->_scrollViewWidth);
  63. make.top.equalTo(0);
  64. make.size.equalTo(CGSizeMake(self->_scrollViewWidth, self->_spsb_height));
  65. }];
  66. }
  67. imageView.userInteractionEnabled = true;
  68. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
  69. [imageView addGestureRecognizer:tap];
  70. }
  71. //添加循环用得图片
  72. for (NSInteger i = 0; i < 2; i ++) {
  73. UIImageView *imageView = [[UIImageView alloc] init];
  74. imageView.contentMode = UIViewContentModeScaleAspectFill;
  75. imageView.backgroundColor = [UIColor whiteColor];
  76. imageView.clipsToBounds = true;
  77. if (_imageArray && _imageArray.count > i * (_pageCount - 1)) {
  78. imageView.image = _imageArray[i * (_pageCount - 1)];
  79. }
  80. [_imageScrollView addSubview:imageView];
  81. [imageView makeConstraints:^(JXHConstraintMaker *make) {
  82. make.leading.equalTo((1 - i) * (self->_pageCount + 1) * self->_scrollViewWidth);
  83. make.top.equalTo(0);
  84. make.size.equalTo(CGSizeMake(self->_scrollViewWidth, self->_spsb_height));
  85. }];
  86. }
  87. if (_pageCount == 1) {
  88. _imageScrollView.scrollEnabled = false;
  89. }
  90. [_imageScrollView makeConstraints:^(JXHConstraintMaker *make) {
  91. make.edges.equalTo(self);
  92. make.size.equalTo(CGSizeMake(self->_scrollViewWidth, self->_spsb_height));
  93. }];
  94. _imageScrollView.contentSize = CGSizeMake(_scrollViewWidth * (_pageCount + 2), self->_spsb_height);
  95. }
  96. - (void)tapAction:(UIGestureRecognizer *)sender {
  97. [self.spsb_advertisementViewDelegate advertisementView:self selectImageWithIndex:sender.view.tag - 2001];
  98. }
  99. - (void)addPageControl {
  100. if (_pageControlView) {
  101. [_pageControlView removeFromSuperview];
  102. _pageControlView = nil;
  103. }
  104. if (_pageCount < 2) return;
  105. _pageControlView = [[UIView alloc] init];
  106. [self addSubview:_pageControlView];
  107. [_pageControlView makeConstraints:^(JXHConstraintMaker *make) {
  108. make.bottom.equalTo(-8);
  109. make.centerX.equalTo(self);
  110. }];
  111. UIView *tempView = nil;
  112. for (NSInteger i = 0; i < _pageCount; i ++) {
  113. UIView *view = [[UIView alloc] init];
  114. view.backgroundColor = [UIColor colorWithWhite:1 alpha:0.7];
  115. view.tag = 3000 + i;
  116. [_pageControlView addSubview:view];
  117. [view makeConstraints:^(JXHConstraintMaker *make) {
  118. make.top.and.bottom.equalTo(0);
  119. if (tempView) {
  120. make.leading.equalTo(tempView.trailing).offset(8);
  121. } else {
  122. make.leading.equalTo(0);
  123. }
  124. make.size.equalTo(CGSizeMake(4, 3));
  125. }];
  126. tempView = view;
  127. }
  128. [tempView makeConstraints:^(JXHConstraintMaker *make) {
  129. make.trailing.equalTo(0);
  130. }];
  131. _pageControlFlag = [[UIView alloc] init];
  132. _pageControlFlag.backgroundColor = [UIColor whiteColor];
  133. [_pageControlView addSubview:_pageControlFlag];
  134. [_pageControlFlag makeConstraints:^(JXHConstraintMaker *make) {
  135. make.top.equalTo(0);
  136. make.centerX.equalTo([self->_pageControlView viewWithTag:3000]);
  137. make.size.equalTo(CGSizeMake(10, 3));
  138. }];
  139. }
  140. - (void)setControlViewIndex:(NSInteger)index {
  141. if (index >= _pageCount) return;
  142. [_pageControlFlag remakeConstraints:^(JXHConstraintMaker *make) {
  143. make.top.equalTo(0);
  144. make.centerX.equalTo([self->_pageControlView viewWithTag:3000 + index]);
  145. make.size.equalTo(CGSizeMake(10, 3));
  146. }];
  147. [UIView animateWithDuration:0.3 animations:^{
  148. [self->_pageControlView layoutSubviews];
  149. }];
  150. }
  151. - (void)reloadDataWithArray:(NSArray<UIImage *> *)array {
  152. _imageArray = array;
  153. _pageCount = array.count;
  154. NSInteger temp = _imageScrollView.contentOffset.x / _scrollViewWidth;
  155. [self addImageView];
  156. [self addPageControl];
  157. if (array.count == 0) return;
  158. if (temp > _pageCount) temp = _pageCount;
  159. if (temp == 0) temp = 1;
  160. _imageScrollView.contentOffset = CGPointMake(temp * _scrollViewWidth, _imageScrollView.contentOffset.y);
  161. }
  162. - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
  163. [_timer invalidate];
  164. _timer = nil;
  165. }
  166. - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
  167. [self addTimer];
  168. }
  169. - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
  170. if (_pageCount > 1) {
  171. if (scrollView.contentOffset.x >= _scrollViewWidth * (_pageCount + 1)) {
  172. scrollView.contentOffset = CGPointMake(_scrollViewWidth, scrollView.contentOffset.y);
  173. } else if (scrollView.contentOffset.x <= 0) {
  174. scrollView.contentOffset = CGPointMake(_scrollViewWidth * _pageCount, scrollView.contentOffset.y);
  175. }
  176. }
  177. if (_pageControlView) {
  178. [self setControlViewIndex: scrollView.contentOffset.x / _scrollViewWidth - 1];
  179. }
  180. }
  181. - (void)addTimer {
  182. _timer = [NSTimer scheduledTimerWithTimeInterval:6 target:self selector:@selector(circulateToScroll) userInfo:nil repeats:true];
  183. }
  184. - (void)circulateToScroll {
  185. if (_pageCount < 2) return;
  186. [UIView animateWithDuration:0.5 animations:^{
  187. self->_imageScrollView.contentOffset = CGPointMake(self->_imageScrollView.contentOffset.x + self->_scrollViewWidth - 1, self->_imageScrollView.contentOffset.y);
  188. } completion:^(BOOL finished) {
  189. NSInteger inter = self->_imageScrollView.contentOffset.x / self->_scrollViewWidth;
  190. CGFloat cgfloat = self->_imageScrollView.contentOffset.x / self->_scrollViewWidth;
  191. self->_imageScrollView.contentOffset = CGPointMake(cgfloat == inter ? self->_imageScrollView.contentOffset.x : self->_scrollViewWidth * (inter + 1), self->_imageScrollView.contentOffset.y);
  192. }];
  193. }
  194. - (void)dealloc {
  195. [_timer invalidate];
  196. _timer = nil;
  197. }
  198. @end
  199. #undef leadingInterval