一个像网易新闻样式的页面控制器的简单解决方案
更多信息请见 更改日志
创建一个继承自 WMPageController
的控制器。初始化 WMPageController
有两种方式:
使用以下构造函数初始化控制器:
- (instancetype)initWithViewControllerClasses:(NSArray *)classes
andTheirTitles:(NSArray *)titles;
这里有以下几个重要属性:
classes :contains the classes of child view controllers, just like [UITableViewController class];
titles :Each View controller's title to show in the menu view at the top of the view;
用法类似于 UITableView
,以下是需要实现的方法:
- (NSInteger)numbersOfChildControllersInPageController:(WMPageController *)pageController;
- (__kindof UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index;
- (NSString *)pageController:(WMPageController *)pageController titleAtIndex:(NSInteger)index;
只需在初始化后在自己的 WMPageController 中实现这些数据源方法。
您可以通过以下方式轻松自定义控制器,只需实现这两个数据源方法。
- (CGRect)pageController:(WMPageController *)pageController preferredFrameForContentView:(WMScrollView *)contentView;
- (CGRect)pageController:(WMPageController *)pageController preferredFrameForMenuView:(WMMenuView *)menuView;
当您想更改内容的框架时,需要调用 -forceLayoutSubViews
方法。这将调用上述数据源方法并重新布局子视图。
如果您感兴趣,请查看 viewFrameExample
获取更多信息。
1.如果您使用子控制器的类初始化 WMPageController
,请覆盖 WMPageController的子控制器
中的 -init
方法,例如:
- (instancetype)init {
return [self initWithNibName:@"xxxViewController" bundle:nil];
}
2.如果您使用数据源,只需实现以下 -pageController:viewControllerAtIndex:
方法:
- (UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"WMViewController"];
return vc;
}
更多信息请见 StoryboardExample
您可以通过设置 xxxPageController.style = WMMenuViewStyleLine
来轻松更改样式。
如果您希望 menuView
在导航栏上显示,请设置 .showOnNavigationBar = YES
;
如果您想获取最新版本,尝试 2.4.0(此版本有一些 API 修改)
pod 'WMPageController', '~> 2.4.0'
如果您希望使用旧版本,只需使用 2.3.0 即可。
pod 'WMPageController', '2.3.0'
如果您在内容控制器的框架或大小时遇到任何问题,请尝试设置 viewFrame
属性,这将允许您自定义大小。
您可以将每个控制器放入 WMPageController
中,但如果您想在其中加入 UICollectionViewController
,请注意 UICollectionViewController的
初始化方法。
您应该覆盖 - init
方法以给 UICollectionViewController
一个 UICollectionViewLayout
。
以下是一个示例:
- (instancetype)init {
// init layout here...
self = [self initWithCollectionViewLayout:layout];
if (self) {
// insert code here...
}
return self;
}
此项目采用 MIT 许可证。有关更多信息,请参阅 LICENSE 文件。