LibraryScrollView.m 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. //
  2. // LibraryScrollView.m
  3. //
  4. //
  5. // Created by Alexi on 3/12/14.
  6. // Copyright (c) 2014 Harman. All rights reserved.
  7. //
  8. #if kSupportLibraryPage
  9. #import "LibraryScrollView.h"
  10. #import "UIViewController+Layout.h"
  11. #import "UIView+Layout.h"
  12. @implementation LibraryScrollView
  13. - (instancetype)init
  14. {
  15. if (self = [super init]) {
  16. _scrollView.scrollEnabled = YES;
  17. self.backgroundColor = kClearColor;
  18. _scrollView.backgroundColor = kClearColor;
  19. _scrollView.clipsToBounds = NO;
  20. }
  21. return self;
  22. }
  23. - (void)relayoutFrameOfSubViews
  24. {
  25. [super relayoutFrameOfSubViews];
  26. NSInteger pageIndex = _pageIndex;
  27. // [self scrollTo:pageIndex];
  28. _scrollView.contentSize = CGSizeMake(_scrollView.frame.size.width * _pages.count, _scrollView.frame.size.height);
  29. for (NSInteger page = 0 ; page < _pages.count; page++)
  30. {
  31. UIViewController *nav = [_pages objectAtIndex:page];
  32. if (nav.view.superview)
  33. {
  34. CGRect rect = _scrollView.bounds;
  35. rect.origin.x = rect.size.width * page;
  36. nav.view.frame = rect;
  37. [nav layoutSubviewsFrame];
  38. }
  39. }
  40. [self scrollTo:pageIndex];
  41. }
  42. - (void)scrollTo:(NSInteger)pageIndex
  43. {
  44. if (pageIndex < 0 || pageIndex >= _pages.count)
  45. {
  46. return;
  47. }
  48. _pageControlUsed = YES;
  49. [UIView animateWithDuration:0.3 animations:^{
  50. CGFloat pageWidth = _scrollView.frame.size.width;
  51. CGPoint p = _scrollView.contentOffset;
  52. p.x = pageIndex * pageWidth;
  53. _scrollView.contentOffset = p;
  54. if (_pageIndex == pageIndex)
  55. {
  56. UIViewController *nav = [_pages objectAtIndex:pageIndex];
  57. if (nav.view.superview)
  58. {
  59. CGRect rect = _scrollView.bounds;
  60. rect.origin.x = rect.size.width * pageIndex;
  61. nav.view.frame = rect;
  62. [nav layoutSubviewsFrame];
  63. }
  64. }
  65. else
  66. {
  67. UIViewController *nav = [_pages objectAtIndex:pageIndex];
  68. if (nav.view.superview == nil)
  69. {
  70. CGRect rect = _scrollView.bounds;
  71. rect.origin.x = rect.size.width * pageIndex;
  72. nav.view.frame = rect;
  73. nav.childSize = rect.size;
  74. [nav layoutSubviewsFrame];
  75. if (_ownController)
  76. {
  77. [_ownController addChild:nav container:_scrollView];
  78. }
  79. else
  80. {
  81. [_scrollView addSubview:nav.view];
  82. }
  83. }
  84. else
  85. {
  86. CGRect rect = _scrollView.bounds;
  87. rect.origin.x = rect.size.width * pageIndex;
  88. nav.view.frame = rect;
  89. [nav layoutSubviewsFrame];
  90. }
  91. }
  92. } completion:^(BOOL finished) {
  93. _pageIndex = pageIndex;
  94. _pageControlUsed = NO;
  95. }];
  96. }
  97. - (void)scrollViewDidScroll:(UIScrollView *)scrollView
  98. {
  99. if (_pageControlUsed)
  100. {
  101. return;
  102. }
  103. CGFloat pageWidth = _scrollView.frame.size.width;
  104. CGPoint offset = _scrollView.contentOffset;
  105. NSInteger pi = floor(((offset.x - pageWidth/2)/pageWidth)+1);
  106. if (_pageIndex == pi)
  107. {
  108. return;
  109. }
  110. else
  111. {
  112. // [self loadPage];
  113. UIViewController *nav = [_pages objectAtIndex:pi];
  114. if (nav.view.superview == nil)
  115. {
  116. CGRect rect = _scrollView.bounds;
  117. rect.origin.x = rect.size.width * pi;
  118. nav.view.frame = rect;
  119. nav.childSize = rect.size;
  120. [nav layoutSubviewsFrame];
  121. if (_ownController)
  122. {
  123. [_ownController addChild:nav container:_scrollView];
  124. }
  125. else
  126. {
  127. [_scrollView addSubview:nav.view];
  128. }
  129. }
  130. else
  131. {
  132. CGRect rect = _scrollView.bounds;
  133. rect.origin.x = rect.size.width * pi;
  134. nav.view.frame = rect;
  135. [nav layoutSubviewsFrame];
  136. }
  137. _pageIndex = pi;
  138. if (_pageIndex >= 0 && _pageIndex < _pages.count)
  139. {
  140. if (_pageScrollDelegate && [_pageScrollDelegate respondsToSelector:@selector(onPageScrollView:scrollToPage:)])
  141. {
  142. [_pageScrollDelegate onPageScrollView:self scrollToPage:_pageIndex];
  143. }
  144. }
  145. }
  146. }
  147. - (void)loadPage
  148. {
  149. for (NSInteger page = 0 ; page < _pages.count; page++)
  150. {
  151. UIViewController *nav = [_pages objectAtIndex:page];
  152. if (nav.view.superview == nil)
  153. {
  154. CGRect rect = _scrollView.bounds;
  155. rect.origin.x = rect.size.width * page;
  156. nav.view.frame = rect;
  157. nav.childSize = rect.size;
  158. [nav layoutSubviewsFrame];
  159. if (_ownController)
  160. {
  161. [_ownController addChild:nav container:_scrollView];
  162. }
  163. else
  164. {
  165. [_scrollView addSubview:nav.view];
  166. }
  167. }
  168. else
  169. {
  170. CGRect rect = _scrollView.bounds;
  171. rect.origin.x = rect.size.width * page;
  172. nav.view.frame = rect;
  173. [nav layoutSubviewsFrame];
  174. }
  175. }
  176. }
  177. - (void)roratePages
  178. {
  179. for (NSInteger page = 0; page < _pages.count; page++)
  180. {
  181. UIViewController *nav = [_pages objectAtIndex:page];
  182. if (nav.view.superview != nil)
  183. {
  184. CGRect rect = _scrollView.bounds;
  185. rect.origin.x = rect.size.width * page;
  186. nav.view.frame = rect;
  187. [nav layoutSubviewsFrame];
  188. }
  189. }
  190. }
  191. - (void)loadPage:(NSInteger)page feedBack:(BOOL)need
  192. {
  193. if (page < 0)
  194. {
  195. return;
  196. }
  197. if (page >= _pages.count)
  198. {
  199. return;
  200. }
  201. if (_pages.count == 0) {
  202. return;
  203. }
  204. UIViewController *nav = [_pages objectAtIndex:page];
  205. if (nav.view.superview == nil)
  206. {
  207. CGRect rect = _scrollView.bounds;
  208. rect.origin.x = rect.size.width * page;
  209. nav.view.frame = rect;
  210. nav.childSize = rect.size;
  211. [nav layoutSubviewsFrame];
  212. if (_ownController)
  213. {
  214. [_ownController addChild:nav container:_scrollView];
  215. }
  216. else
  217. {
  218. [_scrollView addSubview:nav.view];
  219. }
  220. }
  221. else
  222. {
  223. CGRect rect = _scrollView.bounds;
  224. rect.origin.x = rect.size.width * page;
  225. nav.view.frame = rect;
  226. [nav layoutSubviewsFrame];
  227. }
  228. if (need)
  229. {
  230. if (_pageIndex >= 0 && _pageIndex < _pages.count)
  231. {
  232. if (_pageScrollDelegate && [_pageScrollDelegate respondsToSelector:@selector(onPageScrollView:scrollToPage:)])
  233. {
  234. [_pageScrollDelegate onPageScrollView:self scrollToPage:_pageIndex];
  235. }
  236. }
  237. }
  238. }
  239. @end
  240. #endif