AutoScView.m 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. //
  2. // AutoScView.m
  3. // 丰生活
  4. //
  5. // Created by 隋林栋 on 16/1/25.
  6. // Copyright © 2016年 Sl. All rights reserved.
  7. //
  8. #import "AutoScView.h"
  9. //big image
  10. #import "ImageDetailBigView.h"
  11. //网络加载图片
  12. #import <SDWebImage/UIImageView+WebCache.h>
  13. @interface AutoScView()<UIScrollViewDelegate>
  14. @property (nonatomic, strong) UIScrollView * scView;
  15. @property (nonatomic, strong) UIPageControl * pageControl;
  16. @property (strong, nonatomic) UIButton *labelNum;
  17. @end
  18. @implementation AutoScView
  19. @synthesize pageCurrentColor = _pageCurrentColor;
  20. @synthesize pageDefaultColor = _pageDefaultColor;
  21. #pragma mark lazy init
  22. -(UIButton *)labelNum{
  23. if (_labelNum == nil) {
  24. _labelNum = [UIButton buttonWithType:UIButtonTypeCustom];
  25. _labelNum.backgroundColor = [UIColor colorWithHexString:@"#000000" alpha:0.4];
  26. _labelNum.titleLabel.font = [UIFont systemFontOfSize:F(10)];
  27. [GlobalMethod setRoundView:_labelNum color:[UIColor clearColor] numRound:W(22)/2 width:0];
  28. _labelNum.widthHeight = XY(W(40),W(22));
  29. [_labelNum setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)];
  30. }
  31. return _labelNum;
  32. }
  33. - (void)setPageControlToBottom:(CGFloat)pageControlToBottom{
  34. _pageControlToBottom = pageControlToBottom;
  35. _pageControl.centerXBottom = XY(self.width/2.0,self.height-pageControlToBottom);
  36. }
  37. - (UIColor *)pageCurrentColor{
  38. if (!_pageCurrentColor) {
  39. _pageCurrentColor = COLOR_PAGEBACK;
  40. }
  41. return _pageCurrentColor;
  42. }
  43. - (void)setPageCurrentColor:(UIColor *)pageCurrentColor{
  44. _pageCurrentColor = pageCurrentColor;
  45. _pageControl.currentPageIndicatorTintColor = pageCurrentColor;
  46. }
  47. - (UIColor *)pageDefaultColor{
  48. if (!_pageDefaultColor) {
  49. _pageDefaultColor = COLOR_CURRENTPAGE;
  50. }
  51. return _pageDefaultColor;
  52. }
  53. -(void)setPageDefaultColor:(UIColor *)pageDefaultColor{
  54. _pageDefaultColor = pageDefaultColor;
  55. _pageControl.pageIndicatorTintColor = pageDefaultColor;
  56. }
  57. - (NSMutableArray *)aryImage{
  58. if (!_aryImage) {
  59. _aryImage = [NSMutableArray new];
  60. }
  61. return _aryImage;
  62. }
  63. - (UIScrollView *)scView{
  64. if (!_scView) {
  65. //添加sc
  66. _scView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.width, self.height)];
  67. _scView.delegate = self;
  68. _scView.pagingEnabled = YES;
  69. _scView.showsHorizontalScrollIndicator = NO;
  70. _scView.showsVerticalScrollIndicator = NO;
  71. _scView.backgroundColor = [UIColor whiteColor];
  72. _scView.bounces = NO;
  73. _scView.contentSize = CGSizeMake(CGRectGetWidth(self.frame)*3, 0);
  74. }
  75. return _scView;
  76. }
  77. - (UIPageControl *)pageControl{
  78. if (!_pageControl) {
  79. _pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(0, 0, self.width, W(30)) ];
  80. _pageControl.currentPage = 0;
  81. _pageControl.backgroundColor = [UIColor clearColor];
  82. }
  83. return _pageControl;
  84. }
  85. #pragma mark init
  86. - (instancetype)initWithFrame:(CGRect)frame{
  87. self = [super initWithFrame:frame];
  88. if (self) {
  89. [self addSuview];
  90. }
  91. return self;
  92. }
  93. - (instancetype)initWithFrame:(CGRect)frame image:(NSArray *)aryImage{
  94. self = [super initWithFrame:frame];
  95. if (self ) {
  96. [self addSuview];
  97. //refresh rect
  98. [self resetWithImageAry:aryImage];
  99. }
  100. return self;
  101. }
  102. - (void)addSuview{
  103. self.backgroundColor = [UIColor whiteColor];
  104. self.isClickValid = true;
  105. //add subview
  106. [self addSubview:self.scView];
  107. [self addSubview:self.pageControl];
  108. [self addSubview:self.labelNum];
  109. }
  110. #pragma mark resetView
  111. - (void)resetWithImageAry:(NSArray *)aryImage{
  112. self.aryImage = aryImage.mutableCopy;
  113. //reset sc
  114. self.scView.widthHeight = XY(self.width, self.height);
  115. self.scView.contentSize = CGSizeMake(CGRectGetWidth(self.frame)*3, 0);
  116. //reset control
  117. self.pageControl.currentPageIndicatorTintColor = self.pageCurrentColor;
  118. self.pageControl.pageIndicatorTintColor = self.pageDefaultColor;
  119. self.pageControl.numberOfPages = self.aryImage.count;
  120. self.pageControl.hidden = _pageControl.numberOfPages <= 1;
  121. self.pageControl.width = self.width;
  122. self.pageControl.centerXBottom = XY(self.width/2.0,self.height-self.pageControlToBottom);
  123. CGSize pointSize = [self.pageControl sizeForNumberOfPages:self.aryImage.count];
  124. CGFloat page_x = -(self.pageControl.bounds.size.width - pointSize.width) / 2 ;
  125. [self.pageControl setBounds:CGRectMake(page_x + 10, self.pageControl.bounds.origin.y,
  126. self.pageControl.bounds.size.width, self.pageControl.bounds.size.height)];
  127. [_labelNum setTitle:[NSString stringWithFormat:@" %@",[NSString stringWithFormat:@" %d/%ld ",self.numNow+1,self.aryImage.count]] forState:(UIControlStateNormal)];
  128. self.labelNum.rightBottom = XY(self.width-W(15),self.height-W(10));
  129. self.labelNum.hidden = self.isShowNum;
  130. [self resetImageAnimated:NO];
  131. }
  132. #pragma mark 布置图片
  133. - (void)resetImageAnimated:(BOOL)animated{
  134. if (!isAry(self.aryImage))return;
  135. [self.scView removeAllSubViews];
  136. self.numNow = self.numNow<0?self.numNow+(int)self.aryImage.count:self.numNow;
  137. int numTmp =self.numNow-1<0?(int)self.aryImage.count-1+self.numNow:self.numNow-1;
  138. int numFirst = numTmp%self.aryImage.count;
  139. int numSec = self.numNow%self.aryImage.count;
  140. int numThird = (self.numNow+1)%self.aryImage.count;
  141. [self addImage:numFirst index:0];
  142. [self addImage:numSec index:1];
  143. [self addImage:numThird index:2];
  144. [self.scView setContentOffset:CGPointMake(CGRectGetWidth(self.frame), 0) animated:animated];
  145. self.pageControl.currentPage = numSec;
  146. [_labelNum setTitle:[NSString stringWithFormat:@" %@",[NSString stringWithFormat:@" %d/%ld ",numSec+1,self.aryImage.count]] forState:(UIControlStateNormal)];
  147. if (self.blockNum) {
  148. self.blockNum(self.aryImage.count,numSec+1);
  149. }
  150. }
  151. - (void)addImage:(NSUInteger)num index:(int)index{
  152. UIImageView * iv = [[UIImageView alloc]initWithFrame:CGRectMake(index*CGRectGetWidth(self.frame), 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame))];
  153. iv.backgroundColor = [UIColor clearColor];
  154. if (self.aryImage.count<=num) {
  155. return;
  156. }
  157. id imgStr = self.aryImage[num];
  158. if ([(imgStr) isKindOfClass:[NSString class]]) {
  159. iv.image = [UIImage imageNamed:self.aryImage[num]];
  160. }else{
  161. iv.image = self.aryImage[num];
  162. }
  163. // iv.image = [UIImage imageNamed:self.aryImage[num]];
  164. // iv.contentMode = UIViewContentModeScaleAspectFit;
  165. if (iv.image == nil) {
  166. if (self.isShowProductImageStyle) {
  167. [iv sd_setProductImageWithURL:[NSURL URLWithString:self.aryImage[num]] placeholderImage:[UIImage imageNamed:IMAGE_BIG_DEFAULT]];
  168. }else{
  169. [iv sd_setImageWithURL:[NSURL URLWithString:self.aryImage[num]] placeholderImage:[UIImage imageNamed:IMAGE_BIG_DEFAULT] options:SDWebImageAllowInvalidSSLCertificates];
  170. }
  171. }
  172. iv.clipsToBounds = true;
  173. [iv addTarget:self action:@selector(imageClick:)];
  174. [self.scView addSubview:iv];
  175. }
  176. #pragma mark sc代理
  177. - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
  178. [self countNum];
  179. }
  180. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
  181. if (decelerate ==NO) {
  182. [self countNum];
  183. }
  184. }
  185. - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
  186. {
  187. self.numNow++;
  188. [self resetImageAnimated:NO];
  189. }
  190. #pragma mark 重新计算
  191. - (void)countNum{
  192. _numTime = 1;
  193. if (self.scView.contentOffset.x<=5) {
  194. self.numNow--;
  195. [self resetImageAnimated:NO];
  196. }if (self.scView.contentOffset.x>=(CGRectGetWidth(self.frame)*2-5)) {
  197. self.numNow++;
  198. [self resetImageAnimated:NO];
  199. }
  200. }
  201. #pragma mark image click
  202. - (void)imageClick:(UITapGestureRecognizer *)tap{
  203. if (!isAry(self.aryImage)) return;
  204. if (!self.isClickValid) return;
  205. if (self.blockModel) {
  206. int numSec = self.numNow%self.aryImage.count;
  207. self.blockModel(self.aryImageModel[numSec]);
  208. }else if (self.blockCilck){
  209. int numSec = self.numNow%self.aryImage.count;
  210. self.blockCilck(self.aryImage[numSec]);
  211. } else{
  212. UIImageView * iv = (UIImageView *)tap.view;
  213. if (iv && [iv isKindOfClass:[UIImageView class]]) {
  214. ImageDetailBigView * detailView = [ImageDetailBigView new];
  215. int numSec = self.numNow%self.aryImage.count;
  216. for (id strImage in self.aryImage) {
  217. if ([strImage isKindOfClass:[UIImage class]]) {
  218. [GlobalMethod showAlert:@"预览期间不能查看"];
  219. return;
  220. }
  221. }
  222. [detailView resetView:^(){
  223. NSMutableArray * aryImages = [NSMutableArray new];
  224. for (NSString * strImage in self.aryImage) {
  225. ModelImage * model = [ModelImage new];
  226. model.url = strImage;
  227. [aryImages addObject:model];
  228. }
  229. return aryImages;
  230. }() isEdit:false index: numSec];
  231. [detailView showInView:[GB_Nav.lastVC view] imageViewShow:iv];
  232. }
  233. }
  234. }
  235. #pragma mark 定时器相关
  236. - (void)timerStart{
  237. //开启定时器
  238. if (_timer == nil) {
  239. _timer =[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(timerRun) userInfo:nil repeats:YES];
  240. }
  241. _numTime = 0;
  242. }
  243. - (void)timerRun{
  244. //每秒的动作
  245. if (_numTime >0) {
  246. //有人触碰 时间重置
  247. _numTime--;
  248. return;
  249. }
  250. [self.scView setContentOffset:CGPointMake(CGRectGetWidth(self.frame)*2, 0) animated:YES];
  251. }
  252. - (void)timerStop{
  253. //停止定时器
  254. if (self.timer != nil) {
  255. [self.timer invalidate];
  256. self.timer = nil;
  257. }
  258. }
  259. - (void)dealloc{
  260. [self timerStop];
  261. }
  262. @end