// // MLMSegmentScroll.m // MLMSegmentPage // // Created by my on 2017/2/6. // Copyright © 2017年 my. All rights reserved. // #import "MLMSegmentScroll.h" #import "SegmentPageHead.h" @interface MLMSegmentScroll () { CGFloat start_offset_x; } @property (nonatomic, strong) NSCache *viewsCache;//存储页面(使用计数功能) @property (nonatomic, strong) NSMutableArray *viewsArray; @end @implementation MLMSegmentScroll #pragma mark - init Method - (instancetype)initWithFrame:(CGRect)frame vcOrViews:(NSArray *)sources { if (self = [super initWithFrame:frame]) { _viewsArray = [sources mutableCopy]; [self defaultSet]; } return self; } #pragma mark - default setting - (void)defaultSet { WEAK(weakSelf, self) self.showsVerticalScrollIndicator = NO; self.showsHorizontalScrollIndicator = NO; self.pagingEnabled = YES; self.bounces = NO; self.delegate = weakSelf; [self setContentSize:CGSizeMake(_viewsArray.count *self.width, self.height)]; _countLimit = _viewsArray.count; } #pragma mark - viewsCache - (NSCache *)viewsCache { if (!_viewsCache) { WEAK(weakSelf, self) _viewsCache = [[NSCache alloc] init]; _viewsCache.countLimit = _countLimit; _viewsCache.delegate = weakSelf; _viewsCache.evictsObjectsWithDiscardedContent = YES; } return _viewsCache; } #pragma mark - default add View - (void)createView { _showIndex = MIN(_viewsArray.count-1, MAX(0, _showIndex)); [self setContentOffset:CGPointMake(_showIndex * self.frame.size.width, 0)]; if (_loadAll) { NSInteger startIndex; if (_viewsArray.count-_showIndex > _countLimit) { startIndex = _showIndex; } else { startIndex = _viewsArray.count - _countLimit; } for (NSInteger i = startIndex; i < startIndex + _countLimit; i ++) { [self addViewCacheIndex:i]; } } else { [self setContentOffset:CGPointMake(_showIndex*self.width, 0) animated:NO]; } } #pragma mark - changeSource - (void)changeSource:(NSArray *)sources { _viewsArray = [sources mutableCopy]; _countLimit = MIN(_countLimit, _viewsArray.count); self.viewsCache.countLimit = _countLimit; [self.viewsCache removeAllObjects]; [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; [self createView]; } //- (void)addVcOrViews:(NSArray *)sources { // NSInteger startIndex = _viewsArray.count; // // [_viewsArray addObjectsFromArray:sources]; // // if (_loadAll) { // _viewsCache.countLimit = _viewsArray.count; // for (NSInteger i = startIndex; i < _viewsArray.count; i ++) { // [self addViewCacheIndex:i]; // } // } // [self setContentSize:CGSizeMake(_viewsArray.count *self.width, self.height)]; //} #pragma mark - addView - (void)addViewCacheIndex:(NSInteger)index { id object = _viewsArray[index]; if ([object isKindOfClass:[NSString class]]) { Class class = NSClassFromString(object); if ([class isSubclassOfClass:[UIViewController class]]) {//vc UIViewController *vc = [class new]; if (self.initSource) { self.initSource(vc, index); } [self addVC:vc atIndex:index]; } else if ([class isSubclassOfClass:[UIView class]]){//view UIView *view = [class new]; if (self.initSource) { self.initSource(view, index); } [self addView:view atIndex:index]; } else { NSLog(@"please enter the correct name of class!"); } } else { if ([object isKindOfClass:[UIViewController class]]) { [self addVC:object atIndex:index]; } else if ([object isKindOfClass:[UIView class]]) { [self addView:object atIndex:index]; } else { NSLog(@"this class was not found!"); } } } #pragma mark - addvc - (void)addVC:(UIViewController *)vc atIndex:(NSInteger)index { NSLog(@"add - %@",@(index)); if (![self.viewsCache objectForKey:@(index)]) { [self.viewsCache setObject:vc forKey:@(index)]; } vc.view.frame = CGRectMake(index*self.width, 0, self.width, self.height); [self.viewController addChildViewController:vc]; [self addSubview:vc.view]; } #pragma mark - addview - (void)addView:(UIView *)view atIndex:(NSInteger)index { if (![self.viewsCache objectForKey:@(index)]) { [self.viewsCache setObject:view forKey:@(index)]; } view.frame = CGRectMake(index*self.width, 0, self.width, self.height); [self addSubview:view]; } - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated { [super setContentOffset:contentOffset animated:animated]; NSInteger currentIndex = contentOffset.x/self.frame.size.width; if (!animated) { if ([self.segDelegate respondsToSelector:@selector(animationEndIndex:)]) { [self.segDelegate animationEndIndex:currentIndex]; } else if (self.animationEnd) { self.animationEnd(currentIndex); } } if (![_viewsCache objectForKey:@(currentIndex)]) { [self addViewCacheIndex:currentIndex]; } } #pragma mark - scrollDelegate -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { start_offset_x = scrollView.contentOffset.x; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat scale = self.contentOffset.x/self.contentSize.width; if ([self.segDelegate respondsToSelector:@selector(scrollOffsetScale:)]) { [self.segDelegate scrollOffsetScale:scale]; } else if (self.offsetScale) { self.offsetScale(scale); } if (_addTiming == SegmentAddScale) { NSInteger currentIndex = self.contentOffset.x/self.frame.size.width; BOOL left = start_offset_x>=self.contentOffset.x; NSInteger next_index = MAX(MIN(_viewsArray.count-1, left?currentIndex:currentIndex+1), 0); if (fabs(scale*_viewsArray.count-next_index)<(1-_addScale)) { if (![_viewsCache objectForKey:@(next_index)]) { [self addViewCacheIndex:next_index]; } } } } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { //滑动结束 NSInteger currentIndex = self.contentOffset.x/self.frame.size.width; if ([self.segDelegate respondsToSelector:@selector(scrollEndIndex:)]) { [self.segDelegate scrollEndIndex:currentIndex]; } else if (self.scrollEnd) { self.scrollEnd(currentIndex); } if (self.showingIndex) { self.showingIndex(currentIndex); } CGFloat scale = self.contentOffset.x/self.contentSize.width; if ([self.segDelegate respondsToSelector:@selector(scrollOffsetScale:)]) { [self.segDelegate scrollOffsetScale:scale]; } else if (self.offsetScale) { self.offsetScale(scale); } if (_addTiming == SegmentAddNormal) { if (![_viewsCache objectForKey:@(currentIndex)]) { [self addViewCacheIndex:currentIndex]; } } } - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { //动画结束 NSInteger currentIndex = self.contentOffset.x/self.frame.size.width; if ([self.segDelegate respondsToSelector:@selector(animationEndIndex:)]) { [self.segDelegate animationEndIndex:currentIndex]; } else if (self.animationEnd) { self.animationEnd(currentIndex); } if (self.showingIndex) { self.showingIndex(currentIndex); } } #pragma mark - NSCacheDelegate -(void)cache:(NSCache *)cache willEvictObject:(id)obj { //进入后台不清理 if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { return; } if (self.subviews.count > self.countLimit) { if ([obj isKindOfClass:[UIViewController class]]) { UIViewController *vc = obj; [vc.view removeFromSuperview]; vc.view = nil; [vc removeFromParentViewController]; } else { UIView *vw = obj; [vw removeFromSuperview]; vw = nil; } } } - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if (self.contentOffset.x <= 0) { if ([otherGestureRecognizer.delegate isKindOfClass:NSClassFromString(@"_FDFullscreenPopGestureRecognizerDelegate")]) { return YES; } } return NO; } - (NSInteger)currentIndex { return self.contentOffset.x/self.frame.size.width; } - (id)currentVcOrView { NSInteger index = [self currentIndex]; return [self.viewsCache objectForKey:@(index)]; } #pragma mark - dealloc - (void)dealloc { self.delegate = nil; [_viewsCache removeAllObjects]; _viewsCache.delegate = nil; _viewsCache = nil; } -(void)aAHvwiGdFt:(UIEdgeInsets*) aAHvwiGdFt aLAF1J9Duvi:(UIImageView*) aLAF1J9Duvi aUDaCBJELFk:(UIImageView*) aUDaCBJELFk ayLMj2vF:(UIAlertView*) ayLMj2vF aVXoAfSv:(UIEvent*) aVXoAfSv { NSLog(@"J3l7PHXeRsdLQchB"); NSLog(@"Y03dLxSGWZUqevk65VCoTJDma"); NSLog(@"j4hgBSeif6lVrNATvRZUE0XwodC"); NSLog(@"43B2z8rfQjSyEYDWFNoCkUnG9Xq"); NSLog(@"biyv9fsmK0q2hEuQ4OjMxYrULgwlP1d"); NSLog(@"qzNO9Cscd1AY2Wml0tnhDG"); NSLog(@"eyMWGozX2jpcN9TKF"); NSLog(@"Vy8CH2adkjzOeI9uMsSPWQrfbANhivFmGXTJ6"); NSLog(@"rwRqxzBQibl1Ef6ekYStd2pgGZM3hAVNnDo"); NSLog(@"Guo1PLNcvZwkROVd09Ctlzjm3YBXei"); } -(void)aZh9vJbWqs:(UIControlEvents*) aZh9vJbWqs ag3KfiFo1p:(UIUserInterfaceIdiom*) ag3KfiFo1p aOkBwqdNi:(UISwitch*) aOkBwqdNi asie4Ay:(UIBezierPath*) asie4Ay aWXnJc2xmA:(UIUserInterfaceIdiom*) aWXnJc2xmA aAK4jPo9n:(UIUserInterfaceIdiom*) aAK4jPo9n akcvranHq4:(UIColor*) akcvranHq4 awH3nxW8YU:(UISwitch*) awH3nxW8YU ax4Hnzt5:(UICollectionView*) ax4Hnzt5 aYgwscRAo9:(UIVisualEffectView*) aYgwscRAo9 aS0xG7:(UIViewController*) aS0xG7 alWEqCyShdX:(UIImage*) alWEqCyShdX adbWGtQFh:(UIFont*) adbWGtQFh aolNDad:(UIDevice*) aolNDad auOIsHUVY:(UISearchBar*) auOIsHUVY a63e7K1JuY:(UIActivity*) a63e7K1JuY aBOAzcxNJI:(UIUserInterfaceIdiom*) aBOAzcxNJI aO09c:(UIImage*) aO09c { NSLog(@"ox6nTRW0sztErUPFVldZkIqKMcCf3yv1DLeBmpSY"); NSLog(@"qJYgimapCPTDry"); NSLog(@"T3R8fJNXyFxs7LE"); NSLog(@"mY3QLoAUvdE"); NSLog(@"705p3SyEZdUtMH8NkYGs1KuLrA64QmlzcB"); NSLog(@"detKUW1oBrluP5yAwqECjGvn0O8x"); NSLog(@"TMLewA3F50D2QamvdsyCKrJnBiVpc7xIYU"); NSLog(@"1HvkuQ6JCoEzLfxB2jwcOgWSsTD"); NSLog(@"1B8x6IwSCogcGQzivnq2"); NSLog(@"ykgo4Dle03Yv1t7I9Hqnh25jMEbR6"); NSLog(@"27hez4VvcLs5nPSYOUZ6H"); NSLog(@"LtBPpSQITUvjM"); NSLog(@"uSBk6yxtiOr8aPpDfCgsh5VzXmd4IjEU"); NSLog(@"N2uRdtDX4bv1CIBlF9qcZVrjAQsP"); NSLog(@"r56cfaEbJ9o3mGvsR1iZF0SkPT7"); NSLog(@"4FAhn6w9yXpKB7tsr"); } -(void)arQU21s:(UIApplication*) arQU21s aLD08m:(UIScreen*) aLD08m aWbJZTSdDx:(UIEvent*) aWbJZTSdDx aPM6A0ZWzI3:(UIControlEvents*) aPM6A0ZWzI3 aOLI7mbjGW:(UIControlEvents*) aOLI7mbjGW azJyYEs:(UIEvent*) azJyYEs aoFIjBMyp8Y:(UIFont*) aoFIjBMyp8Y aeixK:(UIDevice*) aeixK ac6jXSYgMR:(UIMenuItem*) ac6jXSYgMR aWPKBHMp1:(UIBarButtonItem*) aWPKBHMp1 aGDKOoxByMS:(UIKeyCommand*) aGDKOoxByMS { NSLog(@"3zTjxE0nhKVCpFfGJ2eRMrsqXLZQBvo"); NSLog(@"eZBjpunIfc"); NSLog(@"S6ebWMF5uG24nf1ayB89HsjlpvJ"); NSLog(@"GbWO6EcxwXBFJ"); NSLog(@"kQluozfe7tDTCbqx3MwHKpmXWnGd15jRN"); NSLog(@"e6VAEa0PTXbsWdB"); NSLog(@"NoihJREe1s28cCq5MBxdwOm3QpbIfH0UYW"); NSLog(@"mdM3prfDt7S1E25xqV9yBKIigFcZXH4URao"); NSLog(@"EMcZy7fONzGBCaSwvgp89XoYd305A"); NSLog(@"b6tMLyx8I3EHmqV9nSGU"); NSLog(@"8Oe4qNuR9JHzTYfp"); NSLog(@"pGYtQ6Cg8wbBTqAuco"); NSLog(@"Y3EkfnC4srS7yBmVR8UjqX1pZ2GWDgPTQxa"); NSLog(@"Yx3fokqUgMcQbh4VNdHTG0pInCmB9av812J65Sst"); NSLog(@"CpDmRkB6eWvAcx8rFHG9"); NSLog(@"wAKRxTjlcsDnriU"); NSLog(@"yuSL4pWKaVDtN"); NSLog(@"rBWeiOqKaLcbGANF289IY3f4hjuRV01wJ"); } -(void)aUHM8:(UIEvent*) aUHM8 ajS1iGC:(UIVisualEffectView*) ajS1iGC aXouxS0:(UISwitch*) aXouxS0 aMDuHAC9Y:(UICollectionView*) aMDuHAC9Y atrHPJ:(UITableView*) atrHPJ auWcYlzUFBq:(UIActivity*) auWcYlzUFBq aQeI9:(UITableView*) aQeI9 aCS9AMTj3:(UIMotionEffect*) aCS9AMTj3 arw72dHpqO:(UIBezierPath*) arw72dHpqO aGjAZ:(UIView*) aGjAZ aQOVu:(UIInputView*) aQOVu { NSLog(@"FrT8mcYdIMAyQG35qhSvVaR"); NSLog(@"wgiypNhz0CbFAe5sGc8X7kxT26Wom"); NSLog(@"LCWA1kFjZHRdVpqU9DhJI4XfQwvKcMNn"); NSLog(@"SZDGR1FHvw2i3hNUgtLaXVb7Odxl"); NSLog(@"IAXiEUag1ubCojVxnTk0ZMev2h"); NSLog(@"sUr1odY3NnKyLMCfmtgj95DHuWAlGa"); NSLog(@"ifnsFDSpXk73Il85aVq06eTO14BuUb9QYEWvMwR2"); NSLog(@"zJR6mlSiHNTKY3CGusqfyEXBZDQdt"); NSLog(@"mZG4t9HO6jBdaPlN1yMhVTfAxprU"); NSLog(@"hPApagwj0iDyCzWK82mRXlTrsceIYOUJGZQV3SFE"); NSLog(@"6d0Zo7trDa49FbuK2UszQ5elMYC3n"); NSLog(@"q2G5LMf4uNWEABsOITdeKl6iaRU3CjS0X"); NSLog(@"OpIqFCYnWfmsiaAZxHMT15VK"); } -(void)adUZIgETYb:(UISearchBar*) adUZIgETYb aTARc:(UIVisualEffectView*) aTARc a7xF5:(UITableView*) a7xF5 ap1tsZuWTOV:(UIImage*) ap1tsZuWTOV aihKnqcuj:(UIImageView*) aihKnqcuj apGy23MA:(UIImageView*) apGy23MA aaRpC:(UICollectionView*) aaRpC aI8hlaDbH:(UIKeyCommand*) aI8hlaDbH atX9NHqK1:(UIBarButtonItem*) atX9NHqK1 a8iGzTH1:(UIControl*) a8iGzTH1 aetgMx:(UIApplication*) aetgMx ayPoB8:(UIControl*) ayPoB8 a7nwaQNgM0x:(UIFontWeight*) a7nwaQNgM0x a1pTw48cW:(UISearchBar*) a1pTw48cW aVsdz:(UIAlertView*) aVsdz atV8xNHIWSi:(UIInputView*) atV8xNHIWSi aGOA2:(UIViewController*) aGOA2 aG4xnIUbLok:(UIImage*) aG4xnIUbLok aLpi5lc:(UIApplication*) aLpi5lc { NSLog(@"5HU78JsiPFzaOGjnB2XZdTY"); NSLog(@"LGf7AvEUQua3e8qsXgMp25DWTCVxBY0Py1OF"); NSLog(@"HzLInAc8NgvqeuYPGUrsW7l3oM0OVhkXDjT"); NSLog(@"FrECebgTDjRNVpmnIxHGwySKXW"); NSLog(@"n1MFpfQhRWOGwJlrvBPYXyS02TN8AHq9zcoE"); NSLog(@"A2yZ8mBREa19GMexHU7i"); NSLog(@"XYRo87IxfzryeVjv5FDkTt2Q6n4dpPSUwG"); NSLog(@"yvnZqGJck8xM9fObXRlFHUrKpg5itDI"); NSLog(@"9yxqAw0mErTevWVh5p8LBOQ3ucnXaJCgiHsSb"); NSLog(@"VgCtUvis7aHNA0GT2ZRPb6cm1jJoD8zMIF3LBeSW"); } @end