{"id":18693832,"url":"https://github.com/mengxianliang/xlpageviewcontroller","last_synced_at":"2025-04-06T11:08:35.593Z","repository":{"id":40198730,"uuid":"185162543","full_name":"mengxianliang/XLPageViewController","owner":"mengxianliang","description":"一个开放、高度可定制化的分页视图控制器","archived":false,"fork":false,"pushed_at":"2022-04-29T09:32:37.000Z","size":11913,"stargazers_count":374,"open_issues_count":18,"forks_count":71,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-30T09:09:39.992Z","etag":null,"topics":["ios","objective-c","page","pageviewcontroller","slide"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mengxianliang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-05-06T09:10:24.000Z","updated_at":"2025-03-25T15:22:57.000Z","dependencies_parsed_at":"2022-09-01T11:03:11.061Z","dependency_job_id":null,"html_url":"https://github.com/mengxianliang/XLPageViewController","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mengxianliang%2FXLPageViewController","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mengxianliang%2FXLPageViewController/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mengxianliang%2FXLPageViewController/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mengxianliang%2FXLPageViewController/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mengxianliang","download_url":"https://codeload.github.com/mengxianliang/XLPageViewController/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247471520,"owners_count":20944158,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ios","objective-c","page","pageviewcontroller","slide"],"created_at":"2024-11-07T11:07:17.409Z","updated_at":"2025-04-06T11:08:35.573Z","avatar_url":"https://github.com/mengxianliang.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"![title](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Image/title.png)\n\n## 目录:\n\n* [特点](#特点)\n* [结构](#结构)\n* [App举例](#App举例)\n* [基本属性](#基本属性)\n* [特殊用法](#特殊用法)\n* [使用](#使用)\n* [更新](#更新)\n* [其他](#其他)\n\n\n## 特点:\n\n* 采用UICollectionView+UIPageViewController方案，高性能，低功耗。\n* 支持刷新，内置缓存(非复用)机制，节省内存。\n* 默认配置样式丰富，可实现大部分主流App样式。\n* 支持用户自定义标题样式。\n* 兼容全屏返回手势。\n\n## 结构:\n\n![结构图](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Image/structure.png)\n\n## App举例：\n\n| App | 示例 | \n| ---- | ---- | \n|今日头条|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/1-1.gif)|\n|腾讯新闻|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/1-2.gif)|\n|澎湃新闻|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/1-3.gif)|\n|爱奇艺|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/1-4.gif)|\n|优酷|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/1-5.gif)|\n|腾讯视频|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/1-6.gif)|\n|网易新闻|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/1-7.gif)|\n|人民日报|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/1-8.gif)|\n\n## 基本属性：\n\n| 功能 | 示例 | \n| ---- | ---- | \n|基本样式-标题正常显示|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-1.gif)|\n|基本样式-标题显示在导航栏上|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-2.gif)|\n|Segmented样式-标题正常显示|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-3.gif)|\n|Segmented样式-标题显示在导航栏上|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-4.gif)|\n|标题栏-居左|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-5.gif)|\n|标题栏-居中|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-6.gif)|\n|标题栏-居右|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-7.gif)|\n|标题栏-自定义高度|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-9.gif)|\n|标题-自定义宽度|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-8.gif)|\n|标题-文字居上|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-10.gif)|\n|标题-文字居下|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-11.gif)|\n|标题-关闭标题颜色过渡|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-12.gif)|\n|阴影动画-缩放|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-13.gif)|\n|阴影动画-无|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-14.gif)|\n|阴影末端形状-圆角|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-15.gif)|\n|阴影末端形状-直角|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-16.gif)|\n|阴影-居上|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-17.gif)|\n|阴影-居中|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/2-18.gif)|\n\n\n## 特殊用法：\n\n| 场景 | 示例 | \n| ---- | ---- | \n|自定义标题Cell|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/3-1.gif)|\n|频道定制|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/3-2.gif)|\n|多级嵌套|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/3-3.gif)|\n|子View手势冲突|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/3-4.gif)|\n|手动切换|![image](https://github.com/mengxianliang/XLPageViewController/blob/master/Images/Gif/3-5.gif)|\n\n## 使用:\n\n### 1、创建方法\n\n#### 1.1 导入头文件\n\n```objc\n#import \"XLPageViewController.h\"\n```\n\n#### 1.2 遵守协议\n\n```objc\n@interface ViewController ()\u003cXLPageViewControllerDelegate, XLPageViewControllerDataSrouce\u003e\n```\n\n\n#### 1.3 创建外观配置类\n\n*注：config负责所有的外观配置，```defaultConfig```方法设定了默认参数，使用时可按需配置。* [→Config属性列表](https://github.com/mengxianliang/XLPageViewController/blob/master/ConfigPropertyList.md)\n\n```objc\n  XLPageViewControllerConfig *config = [XLPageViewControllerConfig defaultConfig];\n```\n\n#### 1.4 创建分页控制器\n\n*注：需要把```pageViewController```添加为当前视图控制器的子视图控制器，才能实现子视图控制器中的界面跳转。*\n  \n```objc\n  XLPageViewController *pageViewController = [[XLPageViewController alloc] initWithConfig:config];\n  pageViewController.view.frame = self.view.bounds;\n  pageViewController.delegate = self;\n  pageViewController.dataSource = self;\n  [self.view addSubview:pageViewController.view];\n  [self addChildViewController:pageViewController];\n```\n\n### 2、协议\n\n#### 2.1 XLPageViewControllerDelegate\n\n```objc\n//回调切换位置\n- (void)pageViewController:(XLPageViewController *)pageViewController didSelectedAtIndex:(NSInteger)index;\n```\n\n#### 2.2 XLPageViewControllerDataSrouce\n\n**@required**\n\n```objc\n//根据index创建对应的视图控制器，每个试图控制器只会被创建一次。\n- (UIViewController *)pageViewController:(XLPageViewController *)pageViewController viewControllerForIndex:(NSInteger)index;\n```\n\n```objc\n//根据index返回对应的标题\n- (NSString *)pageViewController:(XLPageViewController *)pageViewController titleForIndex:(NSInteger)index;\n```\n\n```objc\n//返回分页数\n- (NSInteger)pageViewControllerNumberOfPage;\n```\n\n**@optional**\n\n```objc\n//标题cell复用方法，自定义标题cell时用到\n- (__kindof XLPageTitleCell *)pageViewController:(XLPageViewController *)pageViewController titleViewCellForItemAtIndex:(NSInteger)index;\n```\n\n### 3、自定义标题cell\n\n#### 3.1 创建一个```XLPageTitleCell```的子类\n\n```objc\n#import \"XLPageTitleCell.h\"\n\n@interface CustomPageTitleCell : XLPageTitleCell\n\n@end\n```\n\n#### 3.2 注册cell、添加创建cell\n\n```objc\n//需要先注册cell\n[self.pageViewController registerClass:CustomPageTitleCell.class forTitleViewCellWithReuseIdentifier:@\"CustomPageTitleCell\"];\n```\n\n```objc\n//自定义标题cell创建方法\n- (XLPageTitleCell *)pageViewController:(XLPageViewController *)pageViewController titleViewCellForItemAtIndex:(NSInteger)index {\n    CustomPageTitleCell *cell = [pageViewController dequeueReusableTitleViewCellWithIdentifier:@\"CustomPageTitleCell\" forIndex:index];\n    return cell;\n}\n```\n\n#### 3.3 复写cell父类方法\n\n```objc\n//通过此父类方法配置标题cell是否被选中样式\n- (void)configCellOfSelected:(BOOL)selected {\n\n}\n\n//通过此父类方法配置标题cell动画；type:区分是当前选中cell/将要被选中的cell；progress:动画进度0~1\n- (void)showAnimationOfProgress:(CGFloat)progress type:(XLPageTitleCellAnimationType)type {\n    \n}\n\n```\n\n### 4、特殊情况处理\n\n#### 4.1 和子view手势冲突问题\n\n当```pageViewController```的子视图中存在可滚动的子view，例如UISlider、UIScrollView等，如果子view和```pageViewController```发生滚动冲突时，可设置子view的```xl_letMeScrollFirst```属性为true。\n\n```objc\n  UISlider *slider = [[UISlider alloc] init];\n  slider.xl_letMeScrollFirst = true;\n  [childVC.view addSubview:slider];\n```\n\n#### 4.2 全屏返回手势问题\n\n当```pageViewController```和全屏返回手势一起使用时，需要将其它手势的delegate的类名添加到```respondOtherGestureDelegateClassList```属性中。当滚动到第一个分页时，向右滑动会优先响应全屏返回。以**FDFullscreenPopGesture**为例：\n\n```objc\nself.pageViewController.respondOtherGestureDelegateClassList = @[@\"_FDFullscreenPopGestureRecognizerDelegate\"];\n```\n\n### 5、注意事项\n\n使用时需注意**标题不要重复**，**标题**是定位ViewController的唯一ID。\n\n## 更新\n\n```diff\n! 2019/07/29 解决快速滑动导致显示错乱问题\n! 2019/07/31 修正scrollEnabled属性不生效问题\n! 2019/08/01 处理预设selectedIndex如果超出屏幕时，标题选中位置错乱问题\n! 2019/08/03 处理当标题栏样式是Segmented时，点击标题切换慢的问题\n+ 2019/08/03 添加UIViewController扩展标题属性，避免因title改变导致的异常\n! 2019/08/19 解决因滑动距离过大，导致出现空白界面问题\n! 2019/09/05 解决刷新方法可能造成的闪退问题\n! 2019/09/23 解决使用多级嵌套时，可能出现界面错乱问题\n! 2019/09/23 解决滑动切换时，标题栏可能会再一瞬间出现动画失效的问题\n! 2020/03/19 解决滑动距离小，自动回弹后导致标题点击失效问题\n! 2020/03/25 解决从网络获取标题，刷新后阴影位置没有更新问题\n! 2020/04/02 解决设置selectedIndex时，可能出现底部阴影显示出错问题\n! 2020/04/23 解决设置selectedIndex后，代理方法可能不执行问题\n+ 2020/05/06 添加全屏手势解决方案\n```\n\n## 其他\n\n* 频道管理工具[XLChannelControl](https://github.com/mengxianliang/XLChannelControl)\n\n* 开发过的其他UI工具[XLUIKit](https://github.com/mengxianliang/XLUIKit)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmengxianliang%2Fxlpageviewcontroller","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmengxianliang%2Fxlpageviewcontroller","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmengxianliang%2Fxlpageviewcontroller/lists"}