From 7b02207537d35bfa1714bf8beafc921f717d100a Mon Sep 17 00:00:00 2001 From: 单军华 Date: Wed, 11 Jul 2018 10:47:42 +0800 Subject: [PATCH] 首次上传 --- screendisplay/Pods/ZJScrollPageView/ZJScrollPageView/ZJScrollPageView/ZJContentView.m | 455 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 455 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/ZJScrollPageView/ZJScrollPageView/ZJScrollPageView/ZJContentView.m b/screendisplay/Pods/ZJScrollPageView/ZJScrollPageView/ZJScrollPageView/ZJContentView.m new file mode 100755 index 0000000..ead5c44 --- /dev/null +++ b/screendisplay/Pods/ZJScrollPageView/ZJScrollPageView/ZJScrollPageView/ZJContentView.m @@ -0,0 +1,455 @@ +// +// ZJContentView.m +// ZJScrollPageView +// +// Created by jasnig on 16/5/6. +// Copyright �� 2016��� ZeroJ. All rights reserved. +// + +#import "ZJContentView.h" +#import "ZJScrollSegmentView.h" +#import "UIViewController+ZJScrollPageController.h" + +typedef NS_ENUM(NSInteger, ZJScrollPageControllerScrollDirection) { + ZJScrollPageControllerScrollDirectionNone, + ZJScrollPageControllerScrollDirectionLeft, + ZJScrollPageControllerScrollDirectionRight +}; + +@interface ZJContentView ()<UIScrollViewDelegate, UIGestureRecognizerDelegate> { + CGFloat _oldOffSetX; + BOOL _isLoadFirstView; +// BOOL _isAnimating; +} +/** ������������������*/ +@property (weak, nonatomic) ZJScrollSegmentView *segmentView; + + +// ������ ������������������������������ ������weak������������������ +@property (weak, nonatomic) UIViewController *parentViewController; +// ������������������������YES��������� ��������������� scrollView��������������� +@property (assign, nonatomic) BOOL forbidTouchToAdjustPosition; +@property (assign, nonatomic) NSInteger itemsCount; +// ��������������������� +@property (strong, nonatomic) NSMutableDictionary<NSString *, UIViewController<ZJScrollPageViewChildVcDelegate> *> *childVcsDic; +// ��������������� +@property (strong, nonatomic) UIViewController<ZJScrollPageViewChildVcDelegate> *currentChildVc; + +/// ������������cell������������, ������������������������������, ������������������������������������������������, ���������������������������������, ��������������������������������������������������� +//@property (strong, nonatomic) NSCache *cacheChildVcs; + +@property (strong, nonatomic) UIScrollView *scrollView; +@property (strong, nonatomic) UIView *currentView; +@property (strong, nonatomic) UIView *oldView; +@property (assign, nonatomic) NSInteger currentIndex; +@property (assign, nonatomic) NSInteger oldIndex; +@property (assign, nonatomic) ZJScrollPageControllerScrollDirection scrollDirection; + +@end + +@implementation ZJContentView +#define cellID @"cellID" + +static NSString *const kContentOffsetOffKey = @"contentOffset"; +#pragma mark - life cycle + +- (instancetype)initWithFrame:(CGRect)frame segmentView:(ZJScrollSegmentView *)segmentView parentViewController:(UIViewController *)parentViewController delegate:(id<ZJScrollPageViewDelegate>) delegate { + + if (self = [super initWithFrame:frame]) { + self.segmentView = segmentView; + self.delegate = delegate; + self.parentViewController = parentViewController; + + [self commonInit]; + [self addNotification]; + } + return self; +} + +- (void)commonInit { + + _oldIndex = -1; + _currentIndex = -1; + _oldOffSetX = 0.0f; + _forbidTouchToAdjustPosition = NO; + _isLoadFirstView = YES; + if ([_delegate respondsToSelector:@selector(numberOfChildViewControllers)]) { + self.itemsCount = [_delegate numberOfChildViewControllers]; + } + [self addSubview:self.scrollView]; + + [self setCurrentIndex:0 andScrollDirection:ZJScrollPageControllerScrollDirectionNone]; + + if (self.parentViewController.parentViewController && [self.parentViewController.parentViewController isKindOfClass:[UINavigationController class]]) { + UINavigationController *navi = (UINavigationController *)self.parentViewController.parentViewController; + + if (navi.interactivePopGestureRecognizer) { + navi.interactivePopGestureRecognizer.delegate = self; + [self.scrollView.panGestureRecognizer requireGestureRecognizerToFail:navi.interactivePopGestureRecognizer]; + } + } +} + +- (void)addNotification { + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveMemoryWarningHander:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; +} + +- (void)receiveMemoryWarningHander:(NSNotificationCenter *)noti { + + __weak typeof(self) weakSelf = self; + [_childVcsDic enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, UIViewController<ZJScrollPageViewChildVcDelegate> * _Nonnull childVc, BOOL * _Nonnull stop) { + __strong typeof(self) strongSelf = weakSelf; + + if (childVc != strongSelf.currentChildVc) { + [_childVcsDic removeObjectForKey:key]; + [ZJContentView removeChildVc:childVc]; + } + + }]; + +} + +- (void)dealloc { + self.parentViewController = nil; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +#if DEBUG + NSLog(@"ZJContentView---������"); +#endif +} + +#pragma mark - public helper + +/** ���������������������ContentOffSet��������� */ +- (void)setContentOffSet:(CGPoint)offset animated:(BOOL)animated { + self.forbidTouchToAdjustPosition = YES; + + NSInteger currentIndex = offset.x/self.scrollView.bounds.size.width; + _oldIndex = _currentIndex; + [self setCurrentIndex:currentIndex andScrollDirection:ZJScrollPageControllerScrollDirectionNone]; + + if (animated) { + CGFloat delta = offset.x - self.scrollView.contentOffset.x; + NSInteger page = fabs(delta)/self.scrollView.bounds.size.width; + if (page>=2) {// ���������������������������������, ������������������������ + + __weak typeof(self) weakself = self; + dispatch_async(dispatch_get_main_queue(), ^{ + __strong typeof(weakself) strongSelf = weakself; + if (strongSelf) { + [strongSelf.scrollView setContentOffset:offset animated:NO]; + [self didAppearWithIndex:currentIndex]; + [self didDisappearWithIndex:_oldIndex]; + } + }); + } + else { + [self.scrollView setContentOffset:offset animated:animated]; + [self didAppearWithIndex:currentIndex]; + [self didDisappearWithIndex:_oldIndex]; + + } + } + else { + [self.scrollView setContentOffset:offset animated:animated]; + [self didAppearWithIndex:currentIndex]; + [self didDisappearWithIndex:_oldIndex]; + + + } + +} + +/** ������������������������������ */ +- (void)reload { + + [self.childVcsDic enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, UIViewController<ZJScrollPageViewChildVcDelegate> * _Nonnull childVc, BOOL * _Nonnull stop) { + [ZJContentView removeChildVc:childVc]; + childVc = nil; + + }]; + self.childVcsDic = nil; + [self.scrollView removeFromSuperview]; + self.scrollView = nil; + [self commonInit]; +} + ++ (void)removeChildVc:(UIViewController *)childVc { + [childVc willMoveToParentViewController:nil]; + [childVc.view removeFromSuperview]; + [childVc removeFromParentViewController]; +} + +#pragma mark - UIScrollViewDelegate + +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { + if (self.forbidTouchToAdjustPosition) {// first or last + return; + } + + if (scrollView.contentOffset.x <= 0) { + [self contentViewDidMoveFromIndex:0 toIndex:0 progress:1.0]; + return; + + } + if (scrollView.contentOffset.x >= scrollView.contentSize.width - scrollView.bounds.size.width) { + [self contentViewDidMoveFromIndex:_itemsCount-1 toIndex:_itemsCount-1 progress:1.0]; + return; + + } + + CGFloat tempProgress = scrollView.contentOffset.x / self.bounds.size.width; + NSInteger tempIndex = (NSInteger)tempProgress; + CGFloat progress = tempProgress - floor(tempProgress); + CGFloat deltaX = scrollView.contentOffset.x - _oldOffSetX; + + if (deltaX > 0 && (deltaX != scrollView.bounds.size.width)) {// ������ + _oldIndex = tempIndex; + NSInteger tempCurrentIndex = tempIndex + 1; + + [self setCurrentIndex:tempCurrentIndex andScrollDirection:ZJScrollPageControllerScrollDirectionRight]; + + } + else if (deltaX < 0) { + progress = 1.0 - progress; + + _oldIndex = tempIndex + 1; + + [self setCurrentIndex:tempIndex andScrollDirection:ZJScrollPageControllerScrollDirectionLeft]; + + } + else { + return; + } + + NSLog(@"%f------%ld----%ld------", progress, _oldIndex, _currentIndex); + + [self contentViewDidMoveFromIndex:_oldIndex toIndex:_currentIndex progress:progress]; + +} + +/** ������������������������������title��������� */ +- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { + NSInteger currentIndex = (scrollView.contentOffset.x / self.bounds.size.width); + if (_scrollDirection == ZJScrollPageControllerScrollDirectionNone && !_forbidTouchToAdjustPosition) { // ������bounds ������������������������������������������������������������������ ������������������������������������������ ---- ��������������������������������������������������������������� + return; + } + [self contentViewDidMoveFromIndex:currentIndex toIndex:currentIndex progress:1.0]; + // ������title + [self adjustSegmentTitleOffsetToCurrentIndex:currentIndex]; + + if (scrollView.contentOffset.x == _oldOffSetX) {// ��������������� + + [self didAppearWithIndex:currentIndex]; + [self didDisappearWithIndex:_currentIndex]; + } + else { + [self didAppearWithIndex:_currentIndex]; + [self didDisappearWithIndex:_oldIndex]; + } + // ������_currentIndex ���������set������ + _currentIndex = currentIndex; + _scrollDirection = ZJScrollPageControllerScrollDirectionNone; + +} + + +- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { + _oldOffSetX = scrollView.contentOffset.x; + self.forbidTouchToAdjustPosition = NO; + _scrollDirection = ZJScrollPageControllerScrollDirectionNone; + +} + + +#pragma mark - private helper +- (void)contentViewDidMoveFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress { + if(self.segmentView) { + [self.segmentView adjustUIWithProgress:progress oldIndex:fromIndex currentIndex:toIndex]; + } +} + +- (void)adjustSegmentTitleOffsetToCurrentIndex:(NSInteger)index { + if(self.segmentView) { + [self.segmentView adjustTitleOffSetToCurrentIndex:index]; + } + +} + +- (void)willAppearWithIndex:(NSInteger)index { + UIViewController<ZJScrollPageViewChildVcDelegate> *controller = [self.childVcsDic valueForKey:[NSString stringWithFormat:@"%ld", index]]; + if (controller) { + if ([controller respondsToSelector:@selector(zj_viewWillAppearForIndex:)]) { + [controller zj_viewWillAppearForIndex:index]; + } + + if (_delegate && [_delegate respondsToSelector:@selector(scrollPageController:childViewControllWillAppear:forIndex:)]) { + [_delegate scrollPageController:self.parentViewController childViewControllWillAppear:controller forIndex:index]; + } + } + + +} + +- (void)didAppearWithIndex:(NSInteger)index { + UIViewController<ZJScrollPageViewChildVcDelegate> *controller = [self.childVcsDic valueForKey:[NSString stringWithFormat:@"%ld", index]]; + if (controller) { + if ([controller respondsToSelector:@selector(zj_viewDidAppearForIndex:)]) { + [controller zj_viewDidAppearForIndex:index]; + } + + if (_delegate && [_delegate respondsToSelector:@selector(scrollPageController:childViewControllDidAppear:forIndex:)]) { + [_delegate scrollPageController:self.parentViewController childViewControllDidAppear:controller forIndex:index]; + } + } + + + +} + +- (void)willDisappearWithIndex:(NSInteger)index { + UIViewController<ZJScrollPageViewChildVcDelegate> *controller = [self.childVcsDic valueForKey:[NSString stringWithFormat:@"%ld", index]]; + if (controller) { + if ([controller respondsToSelector:@selector(zj_viewWillDisappearForIndex:)]) { + [controller zj_viewWillDisappearForIndex:index]; + } + if (_delegate && [_delegate respondsToSelector:@selector(scrollPageController:childViewControllWillDisappear:forIndex:)]) { + [_delegate scrollPageController:self.parentViewController childViewControllWillDisappear:controller forIndex:index]; + } + } + +} +- (void)didDisappearWithIndex:(NSInteger)index { + UIViewController<ZJScrollPageViewChildVcDelegate> *controller = [self.childVcsDic valueForKey:[NSString stringWithFormat:@"%ld", index]]; + if (controller) { + if ([controller respondsToSelector:@selector(zj_viewDidDisappearForIndex:)]) { + [controller zj_viewDidDisappearForIndex:index]; + } + if (_delegate && [_delegate respondsToSelector:@selector(scrollPageController:childViewControllDidDisappear:forIndex:)]) { + [_delegate scrollPageController:self.parentViewController childViewControllDidDisappear:controller forIndex:index]; + } + } +} + + +- (void)setCurrentIndex:(NSInteger)currentIndex andScrollDirection:(ZJScrollPageControllerScrollDirection)scrollDirection { + if (currentIndex != _currentIndex) { + +// NSLog(@"current -- %ld _current ---- %ld _oldIndex --- %ld", currentIndex, _currentIndex, _oldIndex); + [self setupSubviewsWithCurrentIndex:currentIndex oldIndex:_oldIndex]; + + if (scrollDirection != ZJScrollPageControllerScrollDirectionNone) { + // ������������, ��������������������������������������� + // ������������, ��������������������������������������� + [self didDisappearWithIndex:_currentIndex]; + + } + [self willAppearWithIndex:currentIndex]; + [self willDisappearWithIndex:_oldIndex]; + if (_isLoadFirstView) { // ���������������controller��������� ������������didAppear + [self didAppearWithIndex:currentIndex]; + _isLoadFirstView = NO; + } + + _scrollDirection = scrollDirection; + _currentIndex = currentIndex; + +// NSLog(@"%@",self.scrollView.subviews); + } + +} + +- (void)setupSubviewsWithCurrentIndex:(NSInteger)currentIndex oldIndex:(NSInteger)oldIndex { + UIViewController<ZJScrollPageViewChildVcDelegate> *currentController = [self.childVcsDic valueForKey:[NSString stringWithFormat:@"%ld", (long)currentIndex]]; + + if (_delegate && [_delegate respondsToSelector:@selector(childViewController:forIndex:)]) { + if (currentController == nil) { + currentController = [_delegate childViewController:nil forIndex:currentIndex]; + [self.childVcsDic setValue:currentController forKey:[NSString stringWithFormat:@"%ld", (long)currentIndex]]; + } else { + [_delegate childViewController:currentController forIndex:currentIndex]; + } + } else { + NSAssert(NO, @"���������������������������������������"); + } + + if ([currentController isKindOfClass:[UINavigationController class]]) { + NSAssert(NO, @"������������UINavigationController������������������������"); + + } + + CGFloat width = self.bounds.size.width; + CGFloat height = self.bounds.size.height; + + // ������currentController + if (currentController.zj_scrollViewController != self.parentViewController) { + [self.parentViewController addChildViewController:currentController]; + } + [self.currentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + self.currentView.frame = CGRectMake(currentIndex*width, 0, width, height); + [self.currentView addSubview:currentController.view]; + [_currentChildVc didMoveToParentViewController:self.parentViewController]; + + UIViewController *oldController = [self.childVcsDic valueForKey:[NSString stringWithFormat:@"%ld", (long)_oldIndex]]; + // ������oldController + if (oldController) { + + [self.oldView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + self.oldView.frame = CGRectMake(oldIndex*width, 0, width, height); + [self.oldView addSubview:oldController.view]; + [oldController didMoveToParentViewController:self.parentViewController]; + } + + [self setNeedsLayout]; +} + + + +#pragma mark - UIGestureRecognizerDelegate +- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { + if (self.parentViewController.parentViewController && [self.parentViewController.parentViewController isKindOfClass:[UINavigationController class]]) { + UINavigationController *navi = (UINavigationController *)self.parentViewController.parentViewController; + + if (navi.visibleViewController == self.parentViewController) {// ���������������ScrollPageView��������� ���������������tag���������pop������ + + return self.scrollView.contentOffset.x == 0; + } else { + return [super gestureRecognizerShouldBegin:gestureRecognizer]; + } + } + return [super gestureRecognizerShouldBegin:gestureRecognizer]; +} + + +#pragma mark - getter --- setter +- (UIScrollView *)scrollView { + if (!_scrollView) { + UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.bounds]; + + self.currentView = [[UIView alloc] init]; + self.oldView = [[UIView alloc] init]; + scrollView.delegate = self; + [scrollView addSubview:self.currentView]; + [scrollView addSubview:self.oldView]; + + scrollView.pagingEnabled = YES; + scrollView.showsVerticalScrollIndicator = NO; + scrollView.showsHorizontalScrollIndicator = NO; + scrollView.bounces = self.segmentView.segmentStyle.isContentViewBounces; + scrollView.scrollEnabled = self.segmentView.segmentStyle.isScrollContentView; + scrollView.contentSize = CGSizeMake(self.itemsCount*self.bounds.size.width, self.bounds.size.height); + + _scrollView = scrollView; + } + return _scrollView; +} + +- (NSMutableDictionary<NSString *,UIViewController<ZJScrollPageViewChildVcDelegate> *> *)childVcsDic { + if (!_childVcsDic) { + NSMutableDictionary *dic = [NSMutableDictionary dictionary]; + _childVcsDic = dic; + } + return _childVcsDic; +} + +@end -- Gitblit v1.8.0