猎豆优选

LDPageFlowView.m 25KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. //
  2. // LDPageFlowView.m
  3. // YouHuiProject
  4. //
  5. // Created by liuxueli on 2019/2/25.
  6. // Copyright © 2019 kuxuan. All rights reserved.
  7. //
  8. #import "LDPageFlowView.h"
  9. @interface LDPageFlowView ()
  10. @property (nonatomic, assign, readwrite) NSInteger currentPageIndex;
  11. /**
  12. * 一页的尺寸
  13. */
  14. @property (nonatomic,assign) CGSize pageSize;
  15. @end
  16. //子控制器的类名
  17. static NSString *subviewClassName;
  18. @implementation LDPageFlowView
  19. #pragma mark -
  20. #pragma mark Private Methods
  21. - (void)initialize{
  22. self.clipsToBounds = YES;
  23. self.needsReload = YES;
  24. self.pageCount = 0;
  25. self.isOpenAutoScroll = YES;
  26. self.isCarousel = YES;
  27. self.leftRightMargin = 20;
  28. self.topBottomMargin = 30;
  29. _currentPageIndex = 0;
  30. _minimumPageAlpha = 1.0;
  31. _autoTime = 5.0;
  32. self.visibleRange = NSMakeRange(0, 0);
  33. self.reusableCells = [[NSMutableArray alloc] initWithCapacity:0];
  34. self.cells = [[NSMutableArray alloc] initWithCapacity:0];
  35. self.scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
  36. self.scrollView.scrollsToTop = NO;
  37. self.scrollView.delegate = self;
  38. self.scrollView.pagingEnabled = YES;
  39. self.scrollView.clipsToBounds = NO;
  40. self.scrollView.showsHorizontalScrollIndicator = NO;
  41. self.scrollView.showsVerticalScrollIndicator = NO;
  42. subviewClassName = @"LDBannerVewi";
  43. [self addSubview:self.scrollView];
  44. }
  45. - (void)setLeftRightMargin:(CGFloat)leftRightMargin {
  46. _leftRightMargin = leftRightMargin * 0.5;
  47. }
  48. - (void)setTopBottomMargin:(CGFloat)topBottomMargin {
  49. _topBottomMargin = topBottomMargin * 0.5;
  50. }
  51. - (void)startTimer {
  52. if (self.orginPageCount > 1 && self.isOpenAutoScroll && self.isCarousel) {
  53. NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:self.autoTime target:self selector:@selector(autoNextPage) userInfo:nil repeats:YES];
  54. self.timer = timer;
  55. [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
  56. }
  57. }
  58. - (void)stopTimer {
  59. if (self.timer) {
  60. [self.timer invalidate];
  61. self.timer = nil;
  62. }
  63. }
  64. - (void)adjustCenterSubview {
  65. if (self.isOpenAutoScroll && self.orginPageCount > 0) {
  66. [_scrollView setContentOffset:CGPointMake(_pageSize.width * self.page, 0) animated:NO];
  67. }
  68. }
  69. #pragma mark --自动轮播
  70. - (void)autoNextPage {
  71. self.page ++;
  72. switch (self.orientation) {
  73. case LDPageFlowViewOrientationHorizontal:{
  74. [_scrollView setContentOffset:CGPointMake(self.page * _pageSize.width, 0) animated:YES];
  75. break;
  76. }
  77. case LDPageFlowViewOrientationVertical:{
  78. [_scrollView setContentOffset:CGPointMake(0, self.page * _pageSize.height) animated:YES];
  79. break;
  80. }
  81. default:
  82. break;
  83. }
  84. }
  85. - (void)queueReusableCell:(LDBannerVewi *)cell{
  86. [_reusableCells addObject:cell];
  87. }
  88. - (void)removeCellAtIndex:(NSInteger)index{
  89. LDBannerVewi *cell = [_cells objectAtIndex:index];
  90. if ((NSObject *)cell == [NSNull null]) {
  91. return;
  92. }
  93. [self queueReusableCell:cell];
  94. if (cell.superview) {
  95. [cell removeFromSuperview];
  96. }
  97. [_cells replaceObjectAtIndex:index withObject:[NSNull null]];
  98. }
  99. - (void)refreshVisibleCellAppearance{
  100. if (_minimumPageAlpha == 1.0 && self.leftRightMargin == 0 && self.topBottomMargin == 0) {
  101. return;//无需更新
  102. }
  103. switch (self.orientation) {
  104. case LDPageFlowViewOrientationHorizontal:{
  105. CGFloat offset = _scrollView.contentOffset.x;
  106. for (NSInteger i = self.visibleRange.location; i < self.visibleRange.location + _visibleRange.length; i++) {
  107. LDBannerVewi *cell = [_cells objectAtIndex:i];
  108. subviewClassName = NSStringFromClass([cell class]);
  109. CGFloat origin = cell.frame.origin.x;
  110. CGFloat delta = fabs(origin - offset);
  111. CGRect originCellFrame = CGRectMake(_pageSize.width * i, 0, _pageSize.width, _pageSize.height);//如果没有缩小效果的情况下的本该的Frame
  112. if (delta < _pageSize.width) {
  113. cell.coverView.alpha = (delta / _pageSize.width) * _minimumPageAlpha;
  114. CGFloat leftRightInset = self.leftRightMargin * delta / _pageSize.width;
  115. CGFloat topBottomInset = self.topBottomMargin * delta / _pageSize.width;
  116. cell.layer.transform = CATransform3DMakeScale((_pageSize.width-leftRightInset*2)/_pageSize.width,(_pageSize.height-topBottomInset*2)/_pageSize.height, 1.0);
  117. cell.frame = UIEdgeInsetsInsetRect(originCellFrame, UIEdgeInsetsMake(topBottomInset, leftRightInset, topBottomInset, leftRightInset));
  118. } else {
  119. cell.coverView.alpha = _minimumPageAlpha;
  120. cell.layer.transform = CATransform3DMakeScale((_pageSize.width-self.leftRightMargin*2)/_pageSize.width,(_pageSize.height-self.topBottomMargin*2)/_pageSize.height, 1.0);
  121. cell.frame = UIEdgeInsetsInsetRect(originCellFrame, UIEdgeInsetsMake(self.topBottomMargin, self.leftRightMargin, self.topBottomMargin, self.leftRightMargin));
  122. }
  123. }
  124. break;
  125. }
  126. case LDPageFlowViewOrientationVertical:{
  127. CGFloat offset = _scrollView.contentOffset.y;
  128. for (NSInteger i = self.visibleRange.location; i < self.visibleRange.location + _visibleRange.length; i++) {
  129. LDBannerVewi *cell = [_cells objectAtIndex:i];
  130. subviewClassName = NSStringFromClass([cell class]);
  131. CGFloat origin = cell.frame.origin.y;
  132. CGFloat delta = fabs(origin - offset);
  133. CGRect originCellFrame = CGRectMake(0, _pageSize.height * i, _pageSize.width, _pageSize.height);//如果没有缩小效果的情况下的本该的Frame
  134. if (delta < _pageSize.height) {
  135. cell.coverView.alpha = (delta / _pageSize.height) * _minimumPageAlpha;
  136. CGFloat leftRightInset = self.leftRightMargin * delta / _pageSize.height;
  137. CGFloat topBottomInset = self.topBottomMargin * delta / _pageSize.height;
  138. cell.layer.transform = CATransform3DMakeScale((_pageSize.width-leftRightInset*2)/_pageSize.width,(_pageSize.height-topBottomInset*2) / _pageSize.height, 1.0);
  139. cell.frame = UIEdgeInsetsInsetRect(originCellFrame, UIEdgeInsetsMake(topBottomInset, leftRightInset, topBottomInset, leftRightInset));
  140. cell.mainImageView.frame = cell.bounds;
  141. } else {
  142. cell.coverView.alpha = _minimumPageAlpha;
  143. cell.frame = UIEdgeInsetsInsetRect(originCellFrame, UIEdgeInsetsMake(self.topBottomMargin, self.leftRightMargin, self.topBottomMargin, self.leftRightMargin));
  144. cell.mainImageView.frame = cell.bounds;
  145. }
  146. }
  147. }
  148. default:
  149. break;
  150. }
  151. }
  152. - (void)setPageAtIndex:(NSInteger)pageIndex{
  153. NSParameterAssert(pageIndex >= 0 && pageIndex < [_cells count]);
  154. LDBannerVewi *cell = [_cells objectAtIndex:pageIndex];
  155. if ((NSObject *)cell == [NSNull null]) {
  156. cell = [_dataSource flowView:self cellForPageAtIndex:pageIndex % self.orginPageCount];
  157. NSAssert(cell!=nil, @"datasource must not return nil");
  158. [_cells replaceObjectAtIndex:pageIndex withObject:cell];
  159. cell.tag = pageIndex % self.orginPageCount;
  160. [cell setSubviewsWithSuperViewBounds:CGRectMake(0, 0, _pageSize.width, _pageSize.height)];
  161. __weak __typeof(self) weakSelf = self;
  162. cell.didSelectCellBlock = ^(NSInteger tag, LDBannerVewi *cell) {
  163. [weakSelf singleCellTapAction:tag withCell:cell];
  164. };
  165. switch (self.orientation) {
  166. case LDPageFlowViewOrientationHorizontal:
  167. cell.frame = CGRectMake(_pageSize.width * pageIndex, 0, _pageSize.width, _pageSize.height);
  168. break;
  169. case LDPageFlowViewOrientationVertical:
  170. cell.frame = CGRectMake(0, _pageSize.height * pageIndex, _pageSize.width, _pageSize.height);
  171. break;
  172. default:
  173. break;
  174. }
  175. if (!cell.superview) {
  176. [_scrollView addSubview:cell];
  177. }
  178. }
  179. }
  180. - (void)setPagesAtContentOffset:(CGPoint)offset{
  181. //计算_visibleRange
  182. CGPoint startPoint = CGPointMake(offset.x - _scrollView.frame.origin.x, offset.y - _scrollView.frame.origin.y);
  183. CGPoint endPoint = CGPointMake(startPoint.x + self.bounds.size.width, startPoint.y + self.bounds.size.height);
  184. switch (self.orientation) {
  185. case LDPageFlowViewOrientationHorizontal:{
  186. NSInteger startIndex = 0;
  187. for (int i =0; i < [_cells count]; i++) {
  188. if (_pageSize.width * (i +1) > startPoint.x) {
  189. startIndex = i;
  190. break;
  191. }
  192. }
  193. NSInteger endIndex = startIndex;
  194. for (NSInteger i = startIndex; i < [_cells count]; i++) {
  195. //如果都不超过则取最后一个
  196. if ((_pageSize.width * (i + 1) < endPoint.x && _pageSize.width * (i + 2) >= endPoint.x) || i+ 2 == [_cells count]) {
  197. endIndex = i + 1;//i+2 是以个数,所以其index需要减去1
  198. break;
  199. }
  200. }
  201. //可见页分别向前向后扩展一个,提高效率
  202. startIndex = MAX(startIndex - 1, 0);
  203. endIndex = MIN(endIndex + 1, [_cells count] - 1);
  204. // self.visibleRange.location = startIndex;
  205. // self.visibleRange.length = endIndex - startIndex + 1;
  206. self.visibleRange = NSMakeRange(startIndex, endIndex - startIndex + 1);
  207. for (NSInteger i = startIndex; i <= endIndex; i++) {
  208. [self setPageAtIndex:i];
  209. }
  210. for (int i = 0; i < startIndex; i ++) {
  211. [self removeCellAtIndex:i];
  212. }
  213. for (NSInteger i = endIndex + 1; i < [_cells count]; i ++) {
  214. [self removeCellAtIndex:i];
  215. }
  216. break;
  217. }
  218. case LDPageFlowViewOrientationVertical:{
  219. NSInteger startIndex = 0;
  220. for (int i =0; i < [_cells count]; i++) {
  221. if (_pageSize.height * (i +1) > startPoint.y) {
  222. startIndex = i;
  223. break;
  224. }
  225. }
  226. NSInteger endIndex = startIndex;
  227. for (NSInteger i = startIndex; i < [_cells count]; i++) {
  228. //如果都不超过则取最后一个
  229. if ((_pageSize.height * (i + 1) < endPoint.y && _pageSize.height * (i + 2) >= endPoint.y) || i+ 2 == [_cells count]) {
  230. endIndex = i + 1;//i+2 是以个数,所以其index需要减去1
  231. break;
  232. }
  233. }
  234. //可见页分别向前向后扩展一个,提高效率
  235. startIndex = MAX(startIndex - 1, 0);
  236. endIndex = MIN(endIndex + 1, [_cells count] - 1);
  237. _visibleRange.location = startIndex;
  238. _visibleRange.length = endIndex - startIndex + 1;
  239. for (NSInteger i = startIndex; i <= endIndex; i++) {
  240. [self setPageAtIndex:i];
  241. }
  242. for (NSInteger i = 0; i < startIndex; i ++) {
  243. [self removeCellAtIndex:i];
  244. }
  245. for (NSInteger i = endIndex + 1; i < [_cells count]; i ++) {
  246. [self removeCellAtIndex:i];
  247. }
  248. break;
  249. }
  250. default:
  251. break;
  252. }
  253. }
  254. ////////////////////////////////////////////////////////////////////////////////////////////////////
  255. #pragma mark -
  256. #pragma mark Override Methods
  257. - (id)initWithFrame:(CGRect)frame
  258. {
  259. self = [super initWithFrame:frame];
  260. if (self)
  261. {
  262. [self initialize];
  263. }
  264. return self;
  265. }
  266. - (id)initWithCoder:(NSCoder *)aDecoder
  267. {
  268. self = [super initWithCoder:aDecoder];
  269. if (self)
  270. {
  271. [self initialize];
  272. }
  273. return self;
  274. }
  275. ////////////////////////////////////////////////////////////////////////////////////////////////////
  276. #pragma mark -
  277. #pragma mark LDPageFlowView API
  278. - (void)reloadData {
  279. _needsReload = YES;
  280. //移除所有self.scrollView的子控件
  281. for (UIView *view in self.scrollView.subviews) {
  282. if ([NSStringFromClass(view.class) isEqualToString:subviewClassName] || [view isKindOfClass:[LDBannerVewi class]]) {
  283. [view removeFromSuperview];
  284. }
  285. }
  286. [self stopTimer];
  287. if (_needsReload) {
  288. //如果需要重新加载数据,则需要清空相关数据全部重新加载
  289. //重置pageCount
  290. if (_dataSource && [_dataSource respondsToSelector:@selector(numberOfPagesInFlowView:)]) {
  291. //原始页数
  292. self.orginPageCount = [_dataSource numberOfPagesInFlowView:self];
  293. //总页数
  294. if (self.isCarousel) {
  295. _pageCount = self.orginPageCount == 1 ? 1: [_dataSource numberOfPagesInFlowView:self] * 3;
  296. }else {
  297. _pageCount = self.orginPageCount == 1 ? 1: [_dataSource numberOfPagesInFlowView:self];
  298. }
  299. //如果总页数为0,return
  300. if (_pageCount == 0) {
  301. return;
  302. }
  303. if (self.pageControl && [self.pageControl respondsToSelector:@selector(setNumberOfPages:)]) {
  304. [self.pageControl setNumberOfPages:self.orginPageCount];
  305. }
  306. }
  307. //重置pageWidth
  308. _pageSize = CGSizeMake(self.bounds.size.width - 4 * self.leftRightMargin,(self.bounds.size.width - 4 * self.leftRightMargin) * 9 /16);
  309. if (self.delegate && self.delegate && [self.delegate respondsToSelector:@selector(sizeForPageInFlowView:)]) {
  310. _pageSize = [self.delegate sizeForPageInFlowView:self];
  311. }
  312. [_reusableCells removeAllObjects];
  313. _visibleRange = NSMakeRange(0, 0);
  314. //填充cells数组
  315. [_cells removeAllObjects];
  316. for (NSInteger index=0; index<_pageCount; index++)
  317. {
  318. [_cells addObject:[NSNull null]];
  319. }
  320. // 重置_scrollView的contentSize
  321. switch (self.orientation) {
  322. case LDPageFlowViewOrientationHorizontal://横向
  323. _scrollView.frame = CGRectMake(0, 0, _pageSize.width, _pageSize.height);
  324. _scrollView.contentSize = CGSizeMake(_pageSize.width * _pageCount,0);
  325. CGPoint theCenter = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
  326. _scrollView.center = theCenter;
  327. if (self.orginPageCount > 1) {
  328. if (self.isCarousel) {
  329. //滚到第二组
  330. [_scrollView setContentOffset:CGPointMake(_pageSize.width * self.orginPageCount, 0) animated:NO];
  331. self.page = self.orginPageCount;
  332. //启动自动轮播
  333. [self startTimer];
  334. }else {
  335. //滚到开始
  336. [_scrollView setContentOffset:CGPointMake(0, 0) animated:NO];
  337. self.page = self.orginPageCount;
  338. }
  339. }
  340. break;
  341. case LDPageFlowViewOrientationVertical:{
  342. _scrollView.frame = CGRectMake(0, 0, _pageSize.width, _pageSize.height);
  343. _scrollView.contentSize = CGSizeMake(0 ,_pageSize.height * _pageCount);
  344. CGPoint theCenter = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
  345. _scrollView.center = theCenter;
  346. if (self.orginPageCount > 1) {
  347. if (self.isCarousel) {
  348. //滚到第二组
  349. [_scrollView setContentOffset:CGPointMake(0, _pageSize.height * self.orginPageCount) animated:NO];
  350. self.page = self.orginPageCount;
  351. //启动自动轮播
  352. [self startTimer];
  353. }else {
  354. //滚到第二组
  355. [_scrollView setContentOffset:CGPointMake(0, 0) animated:NO];
  356. self.page = self.orginPageCount;
  357. }
  358. }
  359. break;
  360. }
  361. default:
  362. break;
  363. }
  364. _needsReload = NO;
  365. }
  366. [self setPagesAtContentOffset:_scrollView.contentOffset];//根据当前scrollView的offset设置cell
  367. [self refreshVisibleCellAppearance];//更新各个可见Cell的显示外貌
  368. }
  369. - (LDBannerVewi *)dequeueReusableCell{
  370. LDBannerVewi *cell = [_reusableCells lastObject];
  371. if (cell)
  372. {
  373. [_reusableCells removeLastObject];
  374. }
  375. return cell;
  376. }
  377. - (void)scrollToPage:(NSUInteger)pageNumber {
  378. if (pageNumber < _pageCount) {
  379. //首先停止定时器
  380. [self stopTimer];
  381. if (self.isCarousel) {
  382. self.page = pageNumber + self.orginPageCount;
  383. [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(startTimer) object:nil];
  384. [self performSelector:@selector(startTimer) withObject:nil afterDelay:0.5];
  385. }else {
  386. self.page = pageNumber;
  387. }
  388. switch (self.orientation) {
  389. case LDPageFlowViewOrientationHorizontal:
  390. [_scrollView setContentOffset:CGPointMake(_pageSize.width * self.page, 0) animated:YES];
  391. break;
  392. case LDPageFlowViewOrientationVertical:
  393. [_scrollView setContentOffset:CGPointMake(0, _pageSize.height * self.page) animated:YES];
  394. break;
  395. }
  396. [self setPagesAtContentOffset:_scrollView.contentOffset];
  397. [self refreshVisibleCellAppearance];
  398. }
  399. }
  400. ////////////////////////////////////////////////////////////////////////////////////////////////////
  401. #pragma mark -
  402. #pragma mark hitTest
  403. - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
  404. if ([self pointInside:point withEvent:event]) {
  405. CGPoint newPoint = CGPointZero;
  406. newPoint.x = point.x - _scrollView.frame.origin.x + _scrollView.contentOffset.x;
  407. newPoint.y = point.y - _scrollView.frame.origin.y + _scrollView.contentOffset.y;
  408. if ([_scrollView pointInside:newPoint withEvent:event]) {
  409. return [_scrollView hitTest:newPoint withEvent:event];
  410. }
  411. return _scrollView;
  412. }
  413. return nil;
  414. }
  415. #pragma mark -
  416. #pragma mark UIScrollView Delegate
  417. - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
  418. if (self.orginPageCount == 0) {
  419. return;
  420. }
  421. NSInteger pageIndex;
  422. switch (self.orientation) {
  423. case LDPageFlowViewOrientationHorizontal:
  424. pageIndex = (int)round(_scrollView.contentOffset.x / _pageSize.width) % self.orginPageCount;
  425. break;
  426. case LDPageFlowViewOrientationVertical:
  427. pageIndex = (int)round(_scrollView.contentOffset.y / _pageSize.height) % self.orginPageCount;
  428. break;
  429. default:
  430. break;
  431. }
  432. if (self.isCarousel) {
  433. if (self.orginPageCount > 1) {
  434. switch (self.orientation) {
  435. case LDPageFlowViewOrientationHorizontal:
  436. {
  437. if (scrollView.contentOffset.x / _pageSize.width >= 2 * self.orginPageCount) {
  438. [scrollView setContentOffset:CGPointMake(_pageSize.width * self.orginPageCount, 0) animated:NO];
  439. self.page = self.orginPageCount;
  440. }
  441. if (scrollView.contentOffset.x / _pageSize.width <= self.orginPageCount - 1) {
  442. [scrollView setContentOffset:CGPointMake((2 * self.orginPageCount - 1) * _pageSize.width, 0) animated:NO];
  443. self.page = 2 * self.orginPageCount;
  444. }
  445. }
  446. break;
  447. case LDPageFlowViewOrientationVertical:
  448. {
  449. if (scrollView.contentOffset.y / _pageSize.height >= 2 * self.orginPageCount) {
  450. [scrollView setContentOffset:CGPointMake(0, _pageSize.height * self.orginPageCount) animated:NO];
  451. self.page = self.orginPageCount;
  452. }
  453. if (scrollView.contentOffset.y / _pageSize.height <= self.orginPageCount - 1) {
  454. [scrollView setContentOffset:CGPointMake(0, (2 * self.orginPageCount - 1) * _pageSize.height) animated:NO];
  455. self.page = 2 * self.orginPageCount;
  456. }
  457. }
  458. break;
  459. default:
  460. break;
  461. }
  462. }else {
  463. pageIndex = 0;
  464. }
  465. }
  466. [self setPagesAtContentOffset:scrollView.contentOffset];
  467. [self refreshVisibleCellAppearance];
  468. if (self.pageControl && [self.pageControl respondsToSelector:@selector(setCurrentPage:)]) {
  469. [self.pageControl setCurrentPage:pageIndex];
  470. }
  471. if (_delegate && [_delegate respondsToSelector:@selector(didScrollToPage:inFlowView:)] && _currentPageIndex != pageIndex && pageIndex >= 0) {
  472. [_delegate didScrollToPage:pageIndex inFlowView:self];
  473. }
  474. _currentPageIndex = pageIndex;
  475. }
  476. #pragma mark --将要开始拖拽
  477. - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
  478. [self stopTimer];
  479. }
  480. #pragma mark --结束拖拽
  481. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
  482. [self startTimer];
  483. }
  484. #pragma mark --将要结束拖拽
  485. - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
  486. if (self.orginPageCount > 1 && self.isOpenAutoScroll && self.isCarousel) {
  487. switch (self.orientation) {
  488. case LDPageFlowViewOrientationHorizontal:
  489. {
  490. if (self.page == floor(_scrollView.contentOffset.x / _pageSize.width)) {
  491. self.page = floor(_scrollView.contentOffset.x / _pageSize.width) + 1;
  492. }else {
  493. self.page = floor(_scrollView.contentOffset.x / _pageSize.width);
  494. }
  495. }
  496. break;
  497. case LDPageFlowViewOrientationVertical:
  498. {
  499. if (self.page == floor(_scrollView.contentOffset.y / _pageSize.height)) {
  500. self.page = floor(_scrollView.contentOffset.y / _pageSize.height) + 1;
  501. }else {
  502. self.page = floor(_scrollView.contentOffset.y / _pageSize.height);
  503. }
  504. }
  505. break;
  506. default:
  507. break;
  508. }
  509. }
  510. }
  511. //点击了cell
  512. - (void)singleCellTapAction:(NSInteger)selectTag withCell:(LDBannerVewi *)cell {
  513. if (self.delegate && [self.delegate respondsToSelector:@selector(didSelectCell:withSubViewIndex:)]) {
  514. [self.delegate didSelectCell:cell withSubViewIndex:selectTag];
  515. }
  516. }
  517. //解决当父View释放时,当前视图因为被Timer强引用而不能释放的问题
  518. - (void)willMoveToSuperview:(UIView *)newSuperview {
  519. if (!newSuperview) {
  520. [self stopTimer];
  521. }
  522. }
  523. //解决当timer释放后 回调scrollViewDidScroll时访问野指针导致崩溃
  524. - (void)dealloc {
  525. _scrollView.delegate = nil;
  526. }
  527. @end