# WMPageController **Repository Path**: wangmchn/WMPageController ## Basic Information - **Project Name**: WMPageController - **Description**: WMPageController 是一个方便开发者形成网易新闻首页,控制器翻页导航效果的一个小框架,使用简单 - **Primary Language**: Objective-C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 2 - **Created**: 2015-08-06 - **Last Updated**: 2025-07-21 ## Categories & Tags **Categories**: ios-modules **Tags**: None ## README # 中文介绍 原谅我拙略的英文 ## Issue 须知 鉴于很多朋友在提 issue 的时候没有提供足够的信息,在此希望大家在提 issue 时能够包含下面信息: ``` 1. Xcode / iOS / WMPageController 的版本信息; 2. 编译错误或者运行时错误时,编译器提供的所有信息; 3. 你设置的关键的代码片段; (如果能够提供 demo 复现那就更好了,我就是懒-。-) 4. 其他任何你觉得有可能帮助的信息; ``` 以上信息会更好的帮助我改善这个项目(不要再提为什么我的xxx方法没用这样的问题了,没有信息我真的做不出判断😭)。 如果你有什么好的建议或者修改,非常欢迎提出 issue 或者直接发起 Pull request. 任何改进都非常欢迎:bug 修复, 拼写错误或者用词语法错误, 以及文档补充以及特性需求等等。期待你的贡献! ## 特性 * 增加了缓存机制,对加载过的控制器进行缓存,当内存过高时自动清理缓存。 * 可通过`itemMargin`和`itemsMargins`来定制顶部标题的间距,通过`viewFrame`来定制子控制器的`frame`属性。 * 当标题宽度之和不足宽度时,自动计算并为顶部`item`添加间隙。 * 适配横屏,当设备旋转时自动调整`frame`。 * 可通过设置`itemsWidths`属性来设置不同的标题宽度,例如 `@[@(100),@(80),@(50).....]`; * 增加了`reload`功能,可以像网易新闻那样重新更新标题和控制器。 * 新类型 `WMMenuViewStyleSegmented`, 用于实现 #120 * 如果自动计算的大小有误,可以设置 viewFrame 来获得正确的子控制器大小! ## 使用 创建一个控制器继承自`WMPageController`, 可以通过两种方式来初始化控制器
#### 通过 Class 创建 使用以下方法创建控制器: ```objective-c - (instancetype)initWithViewControllerClasses:(NSArray *)classes andTheirTitles:(NSArray *)titles; ``` 其中,`Classes`是要传人显示的控制器的类型,比如`[UITableViewController class]`, `titles`是要显示的控制对应的标题。 #### 使用 datasource (推荐!) 使用方法和 UITableView 相似,在子类中实现以下数据源方法即可: ```objective-c - (NSInteger)numbersOfChildControllersInPageController:(WMPageController *)pageController; - (__kindof UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index; - (NSString *)pageController:(WMPageController *)pageController titleAtIndex:(NSInteger)index; ``` ## 使用 Storyboard / xib 1.如果用了 **-initWithViewControllerClasses: andTheirTitles:** 来初始化, 那么需要重写子控制器(子控制器是指你添加到 WMPageController 的控制器)的 `-init` 方法,例如: ```objective-c - (instancetype)init { return [self initWithNibName:@"xxxViewController" bundle:nil]; } ``` 2.如果使用 datasource,那么实现对应的数据源即可,例如: ```objective-c - (UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index { UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"WMViewController"]; return vc; } ``` ## Styles 现在有5种样式提供选择,可通过设置 `xxxPageController.style = WMMenuViewStyleLine` 来改变样式.
如果想要在 NavigationBar 上显示导航栏, 设置`.showOnNavigationBar = YES`即可。 ## 使用Pod管理 最新版本是2.4.0,相比较2.3.0有一些 API 接口改动,谨慎选择(可以更加自由的定义 menuView 和 contentView 的 frame)    pod 'WMPageController', ~> '2.4.0' 使用旧的稳定版本:    pod 'WMPageController', ~> '2.3.0' ## 要点 1.如果你的控制器的位置或者大小出现了任何问题,试试设置下 `viewFrame` 这个属性可以帮助你自定义你的控制器大小及位置 2.如果需要传入 `UICollectionViewController`, 需要重写 `- init` 方法,来为`UICollectionViewController`提供一个 `UICollectionViewLayout`。 方式如下: ```objective-c - (instancetype)init { // init layout here... self = [self initWithCollectionViewLayout:layout]; if (self) { // insert code here... } return self; } ``` ## 许可 该项目使用 `MIT` 许可证,详情见 `LICENSE` 文件。