diff --git a/XXPageController.podspec b/XXPageController.podspec index 2d4a905..5a9a81a 100644 --- a/XXPageController.podspec +++ b/XXPageController.podspec @@ -16,7 +16,7 @@ Pod::Spec.new do |spec| # spec.name = "XXPageController" - spec.version = "0.0.4" + spec.version = "0.0.7" spec.summary = "分页加载控制器." spec.description = <<-DESC diff --git a/XXPageController.xcodeproj/project.pbxproj b/XXPageController.xcodeproj/project.pbxproj index ffb9adc..ff56fcd 100755 --- a/XXPageController.xcodeproj/project.pbxproj +++ b/XXPageController.xcodeproj/project.pbxproj @@ -167,7 +167,7 @@ C4F8F6E91C5F41270030181A /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1120; ORGANIZATIONNAME = pogo.inxx; TargetAttributes = { C4F8F6F01C5F41270030181A = { @@ -178,10 +178,9 @@ }; buildConfigurationList = C4F8F6EC1C5F41270030181A /* Build configuration list for PBXProject "XXPageController" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - English, en, Base, ); @@ -255,18 +254,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -289,7 +297,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -300,18 +308,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -328,7 +345,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; diff --git a/XXPageController/ExampleController/PageCell1Controller.m b/XXPageController/ExampleController/PageCell1Controller.m index 7700fbc..621a2ef 100755 --- a/XXPageController/ExampleController/PageCell1Controller.m +++ b/XXPageController/ExampleController/PageCell1Controller.m @@ -16,23 +16,24 @@ @interface PageCell1Controller () @end //#define kNavAndStatus_Height ([[UIApplication sharedApplication] statusBarFrame].size.height + 44) - +#define isIPhoneX (CGSizeEqualToSize(CGSizeMake(375.f, 812.f), [UIScreen mainScreen].bounds.size) || CGSizeEqualToSize(CGSizeMake(812.f, 375.f), [UIScreen mainScreen].bounds.size)) //是否是iphoneX +//底部安全高度 +#define kBottom_Safe_Height (isIPhoneX ? 34 : 0) @implementation PageCell1Controller -(void)viewDidLoad{ [super viewDidLoad]; self.view.backgroundColor = [UIColor yellowColor]; - -// [self addTableView]; + [self addTableView]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; //当调用_childController.view.frame时,触发ChildViewController的-(void)viewDidLoad方法执行,但是这个时候_childController.view还没被添加在父视图上呢,所以坐标是被设置了,但是还没完成设置,也就是没有最终落地到实处。所以tableView去self.view.bounds还是取得默认的试图控制器的宽和高,默认的宽和高是屏幕的宽和高,所以导致了上述问题。 //在 viewWillAppear/viewWillLayoutSubviews/viewDidLayoutSubviews 中 subview 的 frame 是准确的 - if (!_tableView) { - [self addTableView]; - } +// if (!_tableView) { +// [self addTableView]; +// } } @@ -40,18 +41,15 @@ - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; // _tableView.frame = self.view.bounds; // _indicatorView.center = _tableView.center; - } --(UIView *)addHeaderView{ - UIImageView *header = [[UIImageView alloc] initWithFrame:(CGRect){{0, 0}, {self.view.bounds.size.width, 200}}]; - [header setImage:[UIImage imageNamed:@"bg"]]; - header.contentMode = UIViewContentModeScaleAspectFill; - header.clipsToBounds = YES; - - return header; +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + _tableView.frame = self.view.frame; + _indicatorView.center = _tableView.center; } + -(void)addTableView{ CGRect frame = self.view.bounds; //frame.size.height = frame.size.height - kNavAndStatus_Height; @@ -59,20 +57,20 @@ -(void)addTableView{ _tableView.delegate = self; _tableView.dataSource = self; - _tableView.tableHeaderView = [self addHeaderView]; _tableView.tableFooterView = [[UIView alloc] init]; [self.view addSubview:_tableView]; _tableView.hidden = YES; - + _indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; _indicatorView.hidesWhenStopped = YES; + _indicatorView.color = [UIColor redColor]; _indicatorView.center = _tableView.center; [self.view addSubview:_indicatorView]; [_indicatorView startAnimating]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [_indicatorView stopAnimating]; - _tableView.hidden = NO; + [self->_indicatorView stopAnimating]; + self->_tableView.hidden = NO; }); } @@ -83,7 +81,7 @@ -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ - return 20; + return 12; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ diff --git a/XXPageController/ExampleController/PageCell2Controller.m b/XXPageController/ExampleController/PageCell2Controller.m index d1848bc..ff2be5d 100755 --- a/XXPageController/ExampleController/PageCell2Controller.m +++ b/XXPageController/ExampleController/PageCell2Controller.m @@ -56,8 +56,8 @@ -(void)addTableView{ [_indicatorView startAnimating]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [_indicatorView stopAnimating]; - [self.view addSubview:_tableView]; + [self->_indicatorView stopAnimating]; + [self.view addSubview:self->_tableView]; }); } diff --git a/XXPageController/ExampleController/Parent4Controller.m b/XXPageController/ExampleController/Parent4Controller.m index 1682500..019057c 100644 --- a/XXPageController/ExampleController/Parent4Controller.m +++ b/XXPageController/ExampleController/Parent4Controller.m @@ -13,13 +13,23 @@ @interface Parent4Controller () @end +#define kScreenWidth [[UIScreen mainScreen] bounds].size.width +#define kScreenHeight [[UIScreen mainScreen] bounds].size.height +#define kNavAndStatus_Height ([[UIApplication sharedApplication] statusBarFrame].size.height + 44) @implementation Parent4Controller - (void)viewDidLoad { [super viewDidLoad]; - self.view.backgroundColor = [UIColor whiteColor]; + self.view.backgroundColor = [UIColor redColor]; self.title = NSStringFromClass(self.class); + + UIImageView *header = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 150)]; + [header setImage:[UIImage imageNamed:@"bg"]]; + header.contentMode = UIViewContentModeScaleAspectFill; + header.clipsToBounds = YES; + [self.view addSubview:header]; + NSArray *titles = @[@"新闻",@"体育",@"汽车",@"房产"]; NSMutableArray *controllers = [NSMutableArray array]; @@ -28,18 +38,35 @@ - (void)viewDidLoad { }]; XXPageMenuController *pageMenuController = [[XXPageMenuController alloc] initWithTitles:titles controllers:controllers onNavigationBar:NO]; pageMenuController.lineColor = [UIColor orangeColor]; - pageMenuController.titleFont = [UIFont systemFontOfSize:14 weight:UIFontWeightLight]; + pageMenuController.titleFont = [UIFont systemFontOfSize:13]; pageMenuController.titleColor = [UIColor colorWithWhite:0.2 alpha:1]; pageMenuController.titleSelectedColor = [UIColor blackColor]; - pageMenuController.pageBarBgColor = [UIColor whiteColor]; + pageMenuController.pageBarBgColor = [UIColor greenColor]; pageMenuController.pageBarHeight = 44; pageMenuController.lineWidthType = LineWidthTypeStaticShort; - pageMenuController.lineScrollType = arc4random() % 2 + 1; //1,2随机 LineScrollTypeFinishedAnimation 或者 LineScrollTypeFinishedLinear; - + //pageMenuController.lineScrollType = arc4random() % 2 + 1; //1,2随机 LineScrollTypeFinishedAnimation 或者 LineScrollTypeFinishedLinear; + pageMenuController.defaultIndex = 1; + pageMenuController.originY = 50; //因为这里是将pageMenuController添加到ParentController(self类)上的,所以要为pageMenuController设置父视图控制器 - [pageMenuController setSuperViewController:self]; +// [pageMenuController setSuperViewController:self]; + [self addChildViewController:pageMenuController]; + [self.view addSubview:pageMenuController.view]; + +// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ +// +// CGFloat tableViewH = kScreenHeight - kNavAndStatus_Height - pageMenuController.pageBarHeight - 150; +// //pageMenuController.view.frame = CGRectMake(0, pageMenuController.pageBarHeight + 150, kScreenWidth, tableViewH); +// for (PageCell1Controller *vc in controllers) { +// vc.tableViewH = tableViewH; +// [vc reloadDataAndUI]; +// } +// }); + +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; - pageMenuController.defaultIndex = 1; } - (void)didReceiveMemoryWarning { diff --git a/XXPageController/ViewController.m b/XXPageController/ViewController.m index 56708fa..9f29e88 100755 --- a/XXPageController/ViewController.m +++ b/XXPageController/ViewController.m @@ -21,7 +21,7 @@ @interface ViewController () @property(nonatomic,strong)UIColor *color ; @end -#define SCREEN_Width ([[UIScreen mainScreen] bounds].size.width) +#define kScreenWidth [[UIScreen mainScreen] bounds].size.width @implementation ViewController @@ -38,7 +38,7 @@ - (void)viewDidLoad { } -(UIView *)addHeaderView{ - UIImageView *header = [[UIImageView alloc] initWithFrame:CGRectMake(0, -64, SCREEN_Width, 200)]; + UIImageView *header = [[UIImageView alloc] initWithFrame:CGRectMake(0, -64, kScreenWidth, 200)]; [header setImage:[UIImage imageNamed:@"bg"]]; header.contentMode = UIViewContentModeScaleAspectFill; header.clipsToBounds = YES; @@ -56,7 +56,7 @@ -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger) } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ - UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, SCREEN_Width, 30)]; + UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 30)]; label.backgroundColor = [UIColor colorWithWhite:0.8 alpha:0.5]; label.font = [UIFont systemFontOfSize:12]; label.textAlignment = NSTextAlignmentLeft; diff --git a/XXPageController/XXPageMenuController/XXPageMenuController.h b/XXPageController/XXPageMenuController/XXPageMenuController.h index b1f747a..93a1c91 100755 --- a/XXPageController/XXPageMenuController/XXPageMenuController.h +++ b/XXPageController/XXPageMenuController/XXPageMenuController.h @@ -109,6 +109,9 @@ typedef NS_ENUM(NSInteger, PageTitleColorChangeType) { /** 默认选择的 index 位置 ,默认值为0*/ @property (nonatomic,assign) NSInteger defaultIndex; +/** 分页控制器View视图的 Y 轴方向 设置初始位置(适用于分页条不在导航条上的情况) , 动态位置由于UICollectionViewCell 的复用存在不可知 bug, 暂不实现*/ +@property (nonatomic, assign) CGFloat originY; + /** 创建分页控制器 : 自动创建全部控制器(方式一) @@ -148,4 +151,7 @@ typedef NS_ENUM(NSInteger, PageTitleColorChangeType) { */ - (void)setSuperViewController:(UIViewController *)superVc; +/// 【自定义页面的frame】在界面viewDidLayoutSubviews/组件layoutSubviews后调用,让外界有机会修改frame等 +@property (nonatomic, copy) void (^didLayoutSubviewsBlock)(UIView *pageMenuControllerView, UIScrollView *scrollViewPage, UICollectionView *collectionMain); + @end diff --git a/XXPageController/XXPageMenuController/XXPageMenuController.m b/XXPageController/XXPageMenuController/XXPageMenuController.m index 2a1a35a..a100e3b 100755 --- a/XXPageController/XXPageMenuController/XXPageMenuController.m +++ b/XXPageController/XXPageMenuController/XXPageMenuController.m @@ -10,12 +10,13 @@ #define kScreenWidth [[UIScreen mainScreen] bounds].size.width #define kScreenHeight [[UIScreen mainScreen] bounds].size.height +#define kNavAndStatus_Height ([[UIApplication sharedApplication] statusBarFrame].size.height + 44) @interface PopEnabeldCollectionView : UICollectionView @end @implementation PopEnabeldCollectionView - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { - //解决横向滚动的scrollView和系统pop手势返回冲突 + //处理横向滚动的scrollView和系统pop手势返回冲突 if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")] && otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) return YES; return NO; } @@ -40,16 +41,11 @@ - (instancetype)initWithFrame:(CGRect)frame { _titleLabel = [[UILabel alloc] initWithFrame:self.bounds]; _titleLabel.textAlignment = NSTextAlignmentCenter; _titleLabel.lineBreakMode = NSLineBreakByCharWrapping; -// _titleLabel.backgroundColor = [UIColor greenColor]; _titleLabel.userInteractionEnabled = YES; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(titleClick)]; [_titleLabel addGestureRecognizer:tap]; [self addSubview:_titleLabel]; - - - - _titleBtn = [[UIButton alloc] initWithFrame:self.bounds]; _titleBtn.contentMode = UIViewContentModeCenter; _titleBtn.titleEdgeInsets = UIEdgeInsetsMake(0, 3, 0, 0); @@ -91,7 +87,7 @@ @interface XXPageMenuController ()*titles; @property (nonatomic, strong) NSArray *controllersClass; @property (nonatomic, strong) NSArray *controllers; @property (nonatomic, strong) NSArray *icons; @@ -155,8 +151,21 @@ - (void)setSuperViewController:(UIViewController *)superVc { [superVc.view addSubview:self.view]; } +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = [UIColor whiteColor]; + [self configProperties]; + [self addScrollViewPage]; + [self addCollectionMain]; + [self addPageBottomLine]; + [self addObserver:self forKeyPath:@"selectedIndex" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; +} + - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; + if (self.parentViewController ) { + self.parentViewController.edgesForExtendedLayout = UIRectEdgeNone; + } //1. 更新下划线的frame [self updateLineFrameWithIndex:self.selectedIndex]; //2. 更新collection page的显示index 位置 @@ -173,30 +182,13 @@ - (void)viewDidAppear:(BOOL)animated { } } -- (void)loadView { - [super loadView]; - [self configProperties]; - [self addScrollViewPage]; - [self addCollectionMain]; - [self addPageBottomLine]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - self.view.backgroundColor = [UIColor whiteColor]; - [self addObserver:self forKeyPath:@"selectedIndex" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; -} - - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"selectedIndex"]) { NSInteger oldIndex = [[change objectForKey:NSKeyValueChangeOldKey] integerValue]; NSInteger newIndex = [[change objectForKey:NSKeyValueChangeNewKey] integerValue]; - XXPageItemCell *oldCell = _pageCells[oldIndex]; - XXPageItemCell *newCell = _pageCells[newIndex]; - if (newIndex != oldIndex) { - [self reloadCollectionPageCell:oldCell index:oldIndex selected:NO]; - [self reloadCollectionPageCell:newCell index:newIndex selected:YES]; + [self reloadCollectionPageCell:_pageCells[oldIndex] index:oldIndex selected:NO]; + [self reloadCollectionPageCell:_pageCells[newIndex] index:newIndex selected:YES]; } } } @@ -222,7 +214,7 @@ - (void)reloadCollectionPageCell:(XXPageItemCell *)cell index:(NSInteger)index s } completion:^(BOOL finished) { //缩放结束后重置transform, 并设置当前对应的字体大小. 这样就能避免transform从小到大时字体模糊 titleLabel.transform = CGAffineTransformIdentity; - [titleLabel setFont:(selected ? _titleSelectedFont : _titleFont)]; + [titleLabel setFont:(selected ? self->_titleSelectedFont : self->_titleFont)]; }]; } else { [titleLabel setFont:(selected ? _titleSelectedFont : _titleFont)]; @@ -235,6 +227,20 @@ - (void)reloadCollectionPageCell:(XXPageItemCell *)cell index:(NSInteger)index s - (void)configProperties { + //edgesForExtendedLayout 边缘延伸属性,默认为UIRectEdgeAll. + //UIRectEdgeAll 当前视图控制器里各种UI控件会忽略导航栏和标签的存在,布局时若设置其原点设置为(0,0),视图会延伸显示到导航栏的下面被覆盖; + //UIRectEdgeNone: 意味着子控件本身会自动躲避导航栏和标签栏,以免被遮挡。 + self.edgesForExtendedLayout = UIRectEdgeNone; + if (self.parentViewController ) { + self.parentViewController.edgesForExtendedLayout = UIRectEdgeNone; + } + if (_originY != 0) { + CGRect frame = self.view.frame; + frame.origin.y += _originY; + frame.size.height -= _originY; + self.view.frame = frame; + } + //init default value _pageBarHeight = _onNavigationBar ? 44 : (_pageBarHeight ?: 44); _pageBarBgColor = _pageBarBgColor ? : [UIColor whiteColor]; @@ -248,7 +254,6 @@ - (void)configProperties { _titleColor = _titleColor ? : [UIColor colorWithWhite:0.1 alpha:1]; _titleSelectedColor = _titleSelectedColor ?: [UIColor blackColor]; _pageMenuW = _onNavigationBar ? (kScreenWidth - 120) : kScreenWidth; //120为预估的左右navigationItem的总宽度 - if (_pageCellWidthType == PageCellWidthTypeSplitScreen) { //根据titles.count平分宽度 _pageCellW = (_titles.count <= _maxPagesCountInPageShowArea) ? _pageMenuW / _titles.count : _pageMenuW / _maxPagesCountInPageShowArea; @@ -280,13 +285,13 @@ - (void)configProperties { } - (void)addScrollViewPage { - CGFloat navigationBarMaxY = CGRectGetMaxY(self.navigationController.navigationBar.frame); - CGFloat pageMenuY = _onNavigationBar ? 0 : navigationBarMaxY; - CGRect frame = CGRectMake(0, pageMenuY, _pageMenuW, _pageBarHeight); + + CGRect frame = CGRectMake(0, 0, _pageMenuW, _pageBarHeight); UIScrollView *scrollViewPage = [[UIScrollView alloc] initWithFrame:frame]; scrollViewPage.showsVerticalScrollIndicator = NO; scrollViewPage.showsHorizontalScrollIndicator = NO; scrollViewPage.delegate = self; + if (_onNavigationBar) { scrollViewPage.backgroundColor = [UIColor clearColor]; //位于导航条时背景色处理为透明色,不公开属性 if (self.parentViewController && ![self.parentViewController isKindOfClass:[UINavigationController class]]) { @@ -310,8 +315,11 @@ - (void)addScrollViewPage { _pageCells = [NSMutableArray array]; __block CGFloat currentX = 0; - [_pageCellWs enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { - CGFloat pageCellW = [obj floatValue]; + [self.titles enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + CGFloat pageCellW = _pageCellW; + if (_pageCellWidthType == PageCellWidthTypeByTitleLength) { + pageCellW = [self.pageCellWs[idx] floatValue]; + } CGRect frame = CGRectMake(currentX, 0, pageCellW, _pageBarHeight); currentX += pageCellW; XXPageItemCell *pageItemCell = [[XXPageItemCell alloc] initWithFrame:frame]; @@ -340,7 +348,6 @@ - (void)addScrollViewPage { self.scrollViewPage = scrollViewPage; } - - (void)addPageBottomLine { _line = [UIView new]; _line.backgroundColor = _lineColor; @@ -352,17 +359,13 @@ - (void)addPageBottomLine { CGRect childFrame; - (void)addCollectionMain { - UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; layout.minimumLineSpacing = 0; layout.minimumInteritemSpacing = 0; layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; - - CGFloat navigationBarMaxY = CGRectGetMaxY(self.navigationController.navigationBar.frame); - CGFloat y = _onNavigationBar ? navigationBarMaxY : navigationBarMaxY + _pageBarHeight; - layout.itemSize = CGSizeMake(kScreenWidth, kScreenHeight - y); + CGFloat y = _onNavigationBar ? 0 : _pageBarHeight; + layout.itemSize = CGSizeMake(self.view.bounds.size.width, kScreenHeight - kNavAndStatus_Height - y - _originY); CGRect frame = CGRectMake(0, y, layout.itemSize.width, layout.itemSize.height); - PopEnabeldCollectionView *collection = [[PopEnabeldCollectionView alloc] initWithFrame:frame collectionViewLayout:layout]; collection.backgroundColor = [UIColor whiteColor]; collection.dataSource = self; @@ -378,11 +381,20 @@ - (void)addCollectionMain { childFrame = frame; for (UIViewController *childVc in self.controllers) { + //子控制器的frame.origin.y肯定要从其自己的0开始 childFrame.origin.y = 0; childVc.view.frame = childFrame; } } + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + if (self.didLayoutSubviewsBlock) { + self.didLayoutSubviewsBlock(self.view, self.scrollViewPage, self.collectionMain); + } +} + - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return self.titles.count; } @@ -420,11 +432,11 @@ - (void)pageItemCell:(XXPageItemCell *)pageItemCell didSelectItemAtIndex:(NSInte [self updateLineFrameWithIndex:index] ; } completion:^(BOOL finished) { if (needReset) { //复位 - _lineScrollType = lineScrollType; - _pageTitleFontChangeType = titleFontChangeType; - _pageTitleColorChangeType = titleColorChangeType; + self->_lineScrollType = lineScrollType; + self->_pageTitleFontChangeType = titleFontChangeType; + self->_pageTitleColorChangeType = titleColorChangeType; } - _didSelectCollectionPageItem = NO; + self->_didSelectCollectionPageItem = NO; }];