傳送門:喜歡的記得點贊哦
GitHub:https://github.com/Xiexingda/XDPagesView.git
功能簡介:
- XDPagesView是一個多控制器視圖粟誓,代碼結(jié)構(gòu)簡單陨舱,擁有極多的自定義配置項,使用起來非常簡介靈活(該控件不采用分類步绸,也不需要繼承,對源代碼沒有任何代碼污染)
- 支持橫豎屏
- 支持刷新列表
- 支持暗夜模式
- 支持header視圖
- 還有很多经瓷,就不一一列舉了筐乳,自己看吧...
基本用法:
#import "XDPagesView.h"
@interface Demo ()<XDPagesViewDelegate>
...
@end
- (void)viewDidLoad {
[super viewDidLoad];
//配置項隘马,可以做一些自定義配置
XDPagesConfig *config = [XDPagesConfig config];
// 頂部下拉 XDPagesPullOnTop
XDPagesView *pagesView = [[XDPagesView alloc]initWithFrame:self.view.bounds config:config style:XDPagesPullOnTop];
//遵循代理
pagesView.delegate = self;
//設(shè)置header視圖
pagesView.pagesHeader = self.header;
[self.view addSubview:pagesView];
}
#pragma mark -- XDPagesViewDelegate 必須實現(xiàn)以下兩個代理
/*
返回一個標(biāo)題組
標(biāo)題作為每個頁面的唯一,不能重復(fù)
*/
- (NSArray<NSString *> *)xd_pagesViewPageTitles {
return @[@"標(biāo)題一", @"標(biāo)題二", @"標(biāo)題三"];
}
- (UIViewController *)xd_pagesView:(XDPagesView *)pagesView controllerForIndex:(NSInteger)index title:(NSString *)title {
// 緩存復(fù)用控制器
UIViewController *vc = [pagesView dequeueReusablePageForIndex:index];
if (!vc) {
if (index == 0) {
// 傳值方式扫步,可以通過重寫init來實現(xiàn)傳值
Page_0 *page = [[Page_0 alloc]init];
vc = page;
}
else if (index == 1) {
Page_1 *page = [[Page_1 alloc]init];
vc = page;
}
else if(index == 2) {
Page_2 *page = [[Page_2 alloc]init];
vc = page;
}
}
return vc;
}
基礎(chǔ)功能
1. 跳轉(zhuǎn)到某一頁
應(yīng)用場景:
想要切換到某個頁面魔策,可以使用下面兩個方法
功能方法:
- (void)jumpToPage:(NSInteger)page;
- (void)jumpToPage:(NSInteger)page animate:(BOOL)animate;
使用示例:
[pagesView jumpToPage:1];
2. 刷新列表
應(yīng)用場景:
當(dāng)控制器列表有變動時,可以刷新列表河胎,
比如開始只有控制@[@"標(biāo)題一", @"標(biāo)題二", @"標(biāo)題三"]闯袒,后來又添加了一個變成了@[@"標(biāo)題一", @"標(biāo)題二", @"標(biāo)題三", @"標(biāo)題四"]
功能方法:刷新列表后定位到哪一頁
- (void)reloadataToPage:(NSInteger)page;
使用示例:
[pagesView reloadataToPage:1];
3. 刷新配置
應(yīng)用場景:
當(dāng)要對某些配置進行更改時,可以通過刷新配置來實現(xiàn)游岳,比如暗黑模式的處理(注意* 有些屬性是不能被刷新的政敢,具體可參考代碼里注釋)
功能方法:
- (void)reloadConfigs;
使用示例:
//初始化時,我們把標(biāo)題欄配置成綠色
XDPagesConfig *config = [XDPagesConfig config];
config.titleBarBackColor = [UIColor greenColor];
XDPagesView *pagesView = [[XDPagesView alloc]initWithFrame:self.view.bounds config:config style:XDPagesPullOnTop];
pagesView.delegate = self;
pagesView.pagesHeader = self.header;
[self.view addSubview:pagesView];
//暗夜模式時我們需要把導(dǎo)航欄變成黃色
config.titleBarBackColor = [UIColor yellowColor];
//配置更改后胚迫,調(diào)用刷新會立即生效
[pagesView reloadConfigs];
4. 滾動到吸頂位置
應(yīng)用場景:
在某些情況下喷户,為了讓列表展示的內(nèi)容更多,可能需要把列表滾動到吸頂位置
功能方法:
- (void)scrollToCeiling:(BOOL)animate;
使用示例:
[pagesView scrollToCeiling:YES];
5. 添加標(biāo)題欄未讀標(biāo)記
應(yīng)用場景:
通知访锻,未讀消息
功能方法:
/**
展示標(biāo)題欄某個頁面的未讀消息
@param number 未讀數(shù)褪尝,當(dāng)為0時隱藏
@param idx 對應(yīng)索引
@param color badge顏色
@param isNumber 是否顯示數(shù)字
*/
- (void)showBadgeNumber:(NSInteger)number index:(NSInteger)idx color:(UIColor *)color isNumber:(BOOL)isNumber;
使用示例: 在第一個標(biāo)題上展示有五個未讀消息
[pagesView showBadgeNumber:5 index:0 color:[UIColor greenColor] isNumber:YES];
其他可用delegate
/**
已經(jīng)跳到的當(dāng)前界面
@param controller 當(dāng)前控制器
@param index 索引
@param title 標(biāo)題
*/
- (void)xd_pagesViewDidChangeToController:(UIViewController *const)controller index:(NSInteger)index title:(NSString *)title {
}
/**
豎直滾動監(jiān)聽
@param changedy 豎直offset.y
@param ceiling 是否已吸頂
*/
- (void)xd_pagesViewVerticalScrollOffsetyChanged:(CGFloat)changedy isCeiling:(BOOL)ceiling {
}
/**
水平滾動監(jiān)聽
@param changedx 水平offset.x
@param currentPage 當(dāng)前頁
@param willShowPage 目標(biāo)頁
*/
- (void)xd_pagesViewHorizontalScrollOffsetxChanged:(CGFloat)changedx currentPage:(NSInteger)currentPage willShowPage:(NSInteger)willShowPage {
}
/**
自定義標(biāo)題寬度 (注意* 只有當(dāng)config.titleFlex=NO的時候,該代理才會生效)
@param index 索引
@param title 標(biāo)題
*/
- (CGFloat)xd_pagesViewTitleWidthForIndex:(NSInteger)index title:(NSString *)title {
return 100;
}
詳細XDPagesConfig配置項
具體可參考demo中的<其他用法>
注意*:其中標(biāo)記了(??不可被刷新)的配置期犬,不會在調(diào)用- (void)reloadConfigs方法時刷新
/**
titleBar的下劃指示線展示效果
*/
typedef NS_ENUM(NSInteger, SlideLineStyle) {
XDSlideLine_None, // 下劃線無展示效果
XDSlideLine_Scale, // 下劃線伸縮
XDSlideLine_translation // 下劃線平移(默認效果)
};
/**
titleBar的標(biāo)題文字對齊方式
*/
typedef NS_ENUM(NSInteger, TitleVerticalAlignment) {
XDVerticalAlignmentTop = 0, //標(biāo)題頂部垂直對齊
XDVerticalAlignmentMiddle, //標(biāo)題中部垂直對齊
XDVerticalAlignmentBottom, //標(biāo)題底部垂直對齊
};
@property (nonatomic, assign) NSInteger beginPage; // 起始頁(??不可被刷新)
@property (nonatomic, assign) NSInteger maxCacheCount; // 最大緩存頁數(shù)
@property (nonatomic, assign) BOOL pagesSlideEnable; // 是否可滑動翻頁(默認YES)
@property (nonatomic, assign) BOOL animateForPageChange; // 頁面變動時是否需要動畫(默認YES)
@property (nonatomic, assign) BOOL pagesHorizontalBounce; // 是否頁面邊界自由滑動(默認YES)
@property (nonatomic, assign) BOOL needTitleBar; // 是否需要標(biāo)題欄(默認YES)(??不可被刷新)
@property (nonatomic, assign) BOOL titleBarFitHeader; // 是否標(biāo)題欄和header作為一個整體(默認NO)(??不可被刷新)
@property (nonatomic, assign) CGFloat titleBarHeight; // 標(biāo)題欄高度(默認50)(??不可被刷新)
@property (nonatomic, assign) CGFloat titleBarMarginTop; // 懸停位置距上端距離(默認0)
@property (nonatomic, assign) BOOL needTitleBarBottomLine; // 是否需要標(biāo)題欄底線(默認YES)
@property (nonatomic, strong) UIColor *titleBarBottomLineColor; // 底線顏色(默認淺灰色)
@property (nonatomic, assign) BOOL needTitleBarSlideLine; // 是否需要下滑線(默認YES)
@property (nonatomic, assign) SlideLineStyle titleBarSlideLineStyle;// 下劃線跟隨方式
@property (nonatomic, assign) CGFloat titleBarSlideLineWidthRatio; // 下滑線相對于當(dāng)前item寬的比例[0-1]
@property (nonatomic, strong) UIColor *titleBarSlideLineColor; // 下滑線顏色(默認灰色)
@property (nonatomic, strong) UIColor *titleBarBackColor; // 標(biāo)題欄背景色
@property (nonatomic, strong) UIImage *titleBarBackImage; // 標(biāo)題欄背景圖
@property (nonatomic, assign) BOOL titleBarHorizontalBounce; // 標(biāo)題欄是否可以邊界自由滑動(默認YES)
@property (nonatomic, strong) UIView *customTitleBar; // 自定義標(biāo)題欄(??不可被刷新)
@property (nonatomic, strong) UIColor *titleItemBackColor; // 標(biāo)題背景顏色
@property (nonatomic, strong) UIColor *titleItemBackHightlightColor;// 標(biāo)題選中時背景顏色
@property (nonatomic, strong) UIImage *titleItemBackImage; // 標(biāo)題背景圖片
@property (nonatomic, strong) UIImage *titleItemBackHightlightImage;// 標(biāo)題選中時的背景圖片
@property (nonatomic, assign) BOOL titleFlex; // 是否自動計算標(biāo)題寬(默認YES)
@property (nonatomic, assign) BOOL titleGradual; // 是否采用漸變方式(默認YES,只漸變標(biāo)題屬性)
@property (nonatomic, assign) TitleVerticalAlignment titleVerticalAlignment; // 標(biāo)題豎直對齊方式
@property (nonatomic, strong) UIColor *titleTextColor; // 標(biāo)題顏色
@property (nonatomic, strong) UIColor *titleTextHightlightColor; // 標(biāo)題選中時的顏色
@property (nonatomic, strong) UIFont *titleFont; // 標(biāo)題字號大小(默認16)
@property (nonatomic, strong) UIFont *titleHightlightFont; // 選中后的字號大小(默認18)
@property (nonatomic, assign) BOOL needRightBtn; // 是否需要右按鈕(默認NO)(??不可被刷新)
@property (nonatomic, assign) CGSize rightBtnSize; // 右按鈕大小
@property (nonatomic, strong) UIView *rightBtn; // 右按鈕自定義視圖
效果展示(XDPagesView2.0)
頭部下拉刷新:
列表下拉刷新:
標(biāo)題一體