https://github.com/mengxianliang/xlpageviewcontroller
一个开放、高度可定制化的分页视图控制器
https://github.com/mengxianliang/xlpageviewcontroller
ios objective-c page pageviewcontroller slide
Last synced: 2 months ago
JSON representation
一个开放、高度可定制化的分页视图控制器
- Host: GitHub
- URL: https://github.com/mengxianliang/xlpageviewcontroller
- Owner: mengxianliang
- Created: 2019-05-06T09:10:24.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2022-04-29T09:32:37.000Z (about 3 years ago)
- Last Synced: 2025-03-30T09:09:39.992Z (2 months ago)
- Topics: ios, objective-c, page, pageviewcontroller, slide
- Language: Objective-C
- Homepage:
- Size: 11.4 MB
- Stars: 374
- Watchers: 7
- Forks: 71
- Open Issues: 18
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README

## 目录:
* [特点](#特点)
* [结构](#结构)
* [App举例](#App举例)
* [基本属性](#基本属性)
* [特殊用法](#特殊用法)
* [使用](#使用)
* [更新](#更新)
* [其他](#其他)## 特点:
* 采用UICollectionView+UIPageViewController方案,高性能,低功耗。
* 支持刷新,内置缓存(非复用)机制,节省内存。
* 默认配置样式丰富,可实现大部分主流App样式。
* 支持用户自定义标题样式。
* 兼容全屏返回手势。## 结构:

## App举例:
| App | 示例 |
| ---- | ---- |
|今日头条||
|腾讯新闻||
|澎湃新闻||
|爱奇艺||
|优酷||
|腾讯视频||
|网易新闻||
|人民日报||## 基本属性:
| 功能 | 示例 |
| ---- | ---- |
|基本样式-标题正常显示||
|基本样式-标题显示在导航栏上||
|Segmented样式-标题正常显示||
|Segmented样式-标题显示在导航栏上||
|标题栏-居左||
|标题栏-居中||
|标题栏-居右||
|标题栏-自定义高度||
|标题-自定义宽度||
|标题-文字居上||
|标题-文字居下||
|标题-关闭标题颜色过渡||
|阴影动画-缩放||
|阴影动画-无||
|阴影末端形状-圆角||
|阴影末端形状-直角||
|阴影-居上||
|阴影-居中||## 特殊用法:
| 场景 | 示例 |
| ---- | ---- |
|自定义标题Cell||
|频道定制||
|多级嵌套||
|子View手势冲突||
|手动切换||## 使用:
### 1、创建方法
#### 1.1 导入头文件
```objc
#import "XLPageViewController.h"
```#### 1.2 遵守协议
```objc
@interface ViewController ()
```#### 1.3 创建外观配置类
*注:config负责所有的外观配置,```defaultConfig```方法设定了默认参数,使用时可按需配置。* [→Config属性列表](https://github.com/mengxianliang/XLPageViewController/blob/master/ConfigPropertyList.md)
```objc
XLPageViewControllerConfig *config = [XLPageViewControllerConfig defaultConfig];
```#### 1.4 创建分页控制器
*注:需要把```pageViewController```添加为当前视图控制器的子视图控制器,才能实现子视图控制器中的界面跳转。*
```objc
XLPageViewController *pageViewController = [[XLPageViewController alloc] initWithConfig:config];
pageViewController.view.frame = self.view.bounds;
pageViewController.delegate = self;
pageViewController.dataSource = self;
[self.view addSubview:pageViewController.view];
[self addChildViewController:pageViewController];
```### 2、协议
#### 2.1 XLPageViewControllerDelegate
```objc
//回调切换位置
- (void)pageViewController:(XLPageViewController *)pageViewController didSelectedAtIndex:(NSInteger)index;
```#### 2.2 XLPageViewControllerDataSrouce
**@required**
```objc
//根据index创建对应的视图控制器,每个试图控制器只会被创建一次。
- (UIViewController *)pageViewController:(XLPageViewController *)pageViewController viewControllerForIndex:(NSInteger)index;
``````objc
//根据index返回对应的标题
- (NSString *)pageViewController:(XLPageViewController *)pageViewController titleForIndex:(NSInteger)index;
``````objc
//返回分页数
- (NSInteger)pageViewControllerNumberOfPage;
```**@optional**
```objc
//标题cell复用方法,自定义标题cell时用到
- (__kindof XLPageTitleCell *)pageViewController:(XLPageViewController *)pageViewController titleViewCellForItemAtIndex:(NSInteger)index;
```### 3、自定义标题cell
#### 3.1 创建一个```XLPageTitleCell```的子类
```objc
#import "XLPageTitleCell.h"@interface CustomPageTitleCell : XLPageTitleCell
@end
```#### 3.2 注册cell、添加创建cell
```objc
//需要先注册cell
[self.pageViewController registerClass:CustomPageTitleCell.class forTitleViewCellWithReuseIdentifier:@"CustomPageTitleCell"];
``````objc
//自定义标题cell创建方法
- (XLPageTitleCell *)pageViewController:(XLPageViewController *)pageViewController titleViewCellForItemAtIndex:(NSInteger)index {
CustomPageTitleCell *cell = [pageViewController dequeueReusableTitleViewCellWithIdentifier:@"CustomPageTitleCell" forIndex:index];
return cell;
}
```#### 3.3 复写cell父类方法
```objc
//通过此父类方法配置标题cell是否被选中样式
- (void)configCellOfSelected:(BOOL)selected {}
//通过此父类方法配置标题cell动画;type:区分是当前选中cell/将要被选中的cell;progress:动画进度0~1
- (void)showAnimationOfProgress:(CGFloat)progress type:(XLPageTitleCellAnimationType)type {
}```
### 4、特殊情况处理
#### 4.1 和子view手势冲突问题
当```pageViewController```的子视图中存在可滚动的子view,例如UISlider、UIScrollView等,如果子view和```pageViewController```发生滚动冲突时,可设置子view的```xl_letMeScrollFirst```属性为true。
```objc
UISlider *slider = [[UISlider alloc] init];
slider.xl_letMeScrollFirst = true;
[childVC.view addSubview:slider];
```#### 4.2 全屏返回手势问题
当```pageViewController```和全屏返回手势一起使用时,需要将其它手势的delegate的类名添加到```respondOtherGestureDelegateClassList```属性中。当滚动到第一个分页时,向右滑动会优先响应全屏返回。以**FDFullscreenPopGesture**为例:
```objc
self.pageViewController.respondOtherGestureDelegateClassList = @[@"_FDFullscreenPopGestureRecognizerDelegate"];
```### 5、注意事项
使用时需注意**标题不要重复**,**标题**是定位ViewController的唯一ID。
## 更新
```diff
! 2019/07/29 解决快速滑动导致显示错乱问题
! 2019/07/31 修正scrollEnabled属性不生效问题
! 2019/08/01 处理预设selectedIndex如果超出屏幕时,标题选中位置错乱问题
! 2019/08/03 处理当标题栏样式是Segmented时,点击标题切换慢的问题
+ 2019/08/03 添加UIViewController扩展标题属性,避免因title改变导致的异常
! 2019/08/19 解决因滑动距离过大,导致出现空白界面问题
! 2019/09/05 解决刷新方法可能造成的闪退问题
! 2019/09/23 解决使用多级嵌套时,可能出现界面错乱问题
! 2019/09/23 解决滑动切换时,标题栏可能会再一瞬间出现动画失效的问题
! 2020/03/19 解决滑动距离小,自动回弹后导致标题点击失效问题
! 2020/03/25 解决从网络获取标题,刷新后阴影位置没有更新问题
! 2020/04/02 解决设置selectedIndex时,可能出现底部阴影显示出错问题
! 2020/04/23 解决设置selectedIndex后,代理方法可能不执行问题
+ 2020/05/06 添加全屏手势解决方案
```## 其他
* 频道管理工具[XLChannelControl](https://github.com/mengxianliang/XLChannelControl)
* 开发过的其他UI工具[XLUIKit](https://github.com/mengxianliang/XLUIKit)