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