ZJSliderView.m 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. //
  2. // ZJSliderView.m
  3. // MyDamai
  4. //
  5. // Created by mac on 14-10-18.
  6. // Copyright (c) 2014年 zhang jian. All rights reserved.
  7. //
  8. #import "ZJSliderView.h"
  9. #define TOP_TAG 200
  10. #define CONTENT_TAG 201
  11. @interface ZJSliderView ()<UIScrollViewDelegate>
  12. {
  13. UIScrollView *_topScrollView;
  14. NSMutableArray *_titleLabelArray;
  15. UIImageView *_topIndicatorView;
  16. UIScrollView *_contentScrollView;
  17. UILabel *label1;
  18. }
  19. @property (strong,nonatomic) NSArray *viewControllers;
  20. @property (weak,nonatomic) UIViewController *parentViewController;
  21. @property (nonatomic) float titleLabelWidth;
  22. @property(nonatomic,retain)NSArray *vcArr;
  23. @end
  24. @implementation ZJSliderView
  25. - (id)initWithFrame:(CGRect)frame
  26. {
  27. self = [super initWithFrame:frame];
  28. if (self) {
  29. // Initialization code
  30. }
  31. return self;
  32. }
  33. -(void)setViewControllers:(NSArray *)viewControllers owner:(UIViewController *)parentViewController page:(int)page
  34. {
  35. self.parentViewController = parentViewController;
  36. self.viewControllers = viewControllers;
  37. //创建view
  38. _contentScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
  39. _vcArr = viewControllers;
  40. [self lazyLoadVcFromIndex:0];
  41. _contentScrollView.pagingEnabled = YES;
  42. _contentScrollView.tag = CONTENT_TAG;
  43. _contentScrollView.showsHorizontalScrollIndicator = NO;
  44. _contentScrollView.showsVerticalScrollIndicator = NO;
  45. _contentScrollView.delegate = self;
  46. _contentScrollView.bounces = NO;
  47. [self addSubview:_contentScrollView];
  48. /*
  49. for (int i=0; i<viewControllers.count; i++) {
  50. UIViewController *vc = viewControllers[i];
  51. vc.view.frame = CGRectMake(i*_contentScrollView.frame.size.width, 0, _contentScrollView.frame.size.width, _contentScrollView.frame.size.height);
  52. [_contentScrollView addSubview:vc.view];
  53. //非常关键的一句
  54. [self.parentViewController addChildViewController:vc];
  55. }
  56. */
  57. _contentScrollView.contentSize = CGSizeMake(_contentScrollView.frame.size.width * viewControllers.count, _contentScrollView.frame.size.height);
  58. //显示第0页
  59. [self contentScrollViewShowPage:page];
  60. }
  61. //懒加载策略
  62. -(void)lazyLoadVcFromIndex:(NSInteger )index
  63. {
  64. UIViewController *vc = _vcArr[index];
  65. vc.view.frame = CGRectMake(_contentScrollView.frame.size.width*index,0, _contentScrollView.frame.size.width,_contentScrollView.frame.size.height);
  66. [_contentScrollView addSubview:vc.view];
  67. [self.parentViewController addChildViewController:vc];
  68. }
  69. //获取顶部的控制滚动视图
  70. -(UIView *)topControlViewWithFrame:(CGRect)frame titleLabelWidth:(CGFloat)titleLabelWidth page:(int)page;
  71. {
  72. //设置label宽度
  73. if(titleLabelWidth == 0)
  74. {
  75. titleLabelWidth = 80;
  76. }
  77. _titleLabelWidth = titleLabelWidth;
  78. //滚动视图
  79. _topScrollView = [[UIScrollView alloc] initWithFrame:frame];
  80. _topScrollView.tag = TOP_TAG;
  81. _topScrollView.showsHorizontalScrollIndicator = NO;
  82. _topScrollView.showsVerticalScrollIndicator = NO;
  83. _topScrollView.delegate = self;
  84. [self addSubview:_topScrollView];
  85. //添加view
  86. _titleLabelArray = [[NSMutableArray alloc] init];
  87. for (int i=0; i<_viewControllers.count; i++) {
  88. UIViewController *vc = _viewControllers[i];
  89. label1 = [[UILabel alloc] initWithFrame:CGRectMake(titleLabelWidth * i, 0, titleLabelWidth, _topScrollView.frame.size.height)];
  90. label1.text = vc.title;
  91. label1.userInteractionEnabled = YES;
  92. label1.tag = i+100;
  93. label1.font = [UIFont systemFontOfSize:14];
  94. label1.textAlignment = NSTextAlignmentCenter;
  95. [_titleLabelArray addObject:label1];
  96. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dealTap:)];
  97. [label1 addGestureRecognizer:tap];
  98. [_topScrollView addSubview:label1];
  99. }
  100. _topScrollView.contentSize = CGSizeMake(titleLabelWidth * _viewControllers.count, _topScrollView.frame.size.height);
  101. //添加提示视图
  102. _topIndicatorView = [[UIImageView alloc] init];
  103. CGFloat indicatorViewW = label1.frame.size.width/2;
  104. CGFloat indicatorViewCenterX = label1.center.x;
  105. _topIndicatorView.frame = CGRectMake(indicatorViewCenterX - indicatorViewW / 2, 42, indicatorViewW, 2);
  106. _topIndicatorView.backgroundColor = NewButtonColor;
  107. [_topScrollView addSubview:_topIndicatorView];
  108. [self topScrollViewShowPage:page];
  109. return _topScrollView;
  110. }
  111. #pragma mark - 处理动画结束
  112. -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
  113. {
  114. if(scrollView.tag == CONTENT_TAG)
  115. {
  116. //注意0除
  117. int page = scrollView.contentOffset.x / self.frame.size.width;
  118. [self topScrollViewShowPage:page];
  119. [self lazyLoadVcFromIndex:page];
  120. _NewZJSlider(page);
  121. }
  122. }
  123. -(void)dealTap:(UITapGestureRecognizer *)tap
  124. {
  125. int page = tap.view.tag - 100;
  126. [self topScrollViewShowPage:page];
  127. [self contentScrollViewShowPage:page];
  128. [self lazyLoadVcFromIndex:page];
  129. _NewZJSlider(page);
  130. }
  131. -(void)topScrollViewShowPage:(int)page
  132. {
  133. for (UILabel *label in _titleLabelArray) {
  134. label.textColor = [UIColor blackColor];
  135. }
  136. UILabel *selectLabel = _titleLabelArray[page];
  137. selectLabel.textColor = NewButtonColor;
  138. [UIView animateWithDuration:0.2 animations:^{
  139. CGFloat indicatorViewW = selectLabel.frame.size.width/2;
  140. CGFloat indicatorViewCenterX = selectLabel.center.x;
  141. _topIndicatorView.frame = CGRectMake(indicatorViewCenterX - indicatorViewW / 2, 41, indicatorViewW, 3);
  142. // _topIndicatorView.frame = selectLabel.frame;
  143. }];
  144. //计算偏移量
  145. if (label1.center.x<SCREEN_WIDTH/2) {
  146. [_topScrollView setContentOffset:CGPointMake(0, 0) animated:YES];
  147. }else if (label1.center.x>_topScrollView.frame.size.width-SCREEN_WIDTH/2)
  148. {
  149. [_topScrollView setContentOffset:CGPointMake(_topScrollView.contentSize.width-SCREEN_WIDTH, 0) animated:YES];
  150. }else
  151. {
  152. [_topScrollView setContentOffset:CGPointMake(label1.center.x-SCREEN_WIDTH/2, 0) animated:YES];
  153. }
  154. }
  155. -(void)contentScrollViewShowPage:(int)page
  156. {
  157. [_contentScrollView setContentOffset:CGPointMake(page * _contentScrollView.frame.size.width, 0) animated:YES];
  158. [self lazyLoadVcFromIndex:page];
  159. }
  160. /*
  161. // Only override drawRect: if you perform custom drawing.
  162. // An empty implementation adversely affects performance during animation.
  163. - (void)drawRect:(CGRect)rect
  164. {
  165. // Drawing code
  166. }
  167. */
  168. @end