From 83b9d5c682b21d88133f24da0f94dd56bd79e687 Mon Sep 17 00:00:00 2001
From: 单军华
Date: Thu, 19 Jul 2018 13:38:55 +0800
Subject: [PATCH] change
---
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