123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- //
- // MLMSegmentScroll.m
- // MLMSegmentPage
- //
- // Created by my on 2017/2/6.
- // Copyright © 2017年 my. All rights reserved.
- //
- #import "MLMSegmentScroll.h"
- #import "SegmentPageHead.h"
- @interface MLMSegmentScroll () <NSCacheDelegate,UIScrollViewDelegate>
- {
- 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
|