An easy solution to page controllers like NetEase News
See CHANGELOG for more information.
Create an controller extends from WMPageController
.There are two ways to init the WMPageController
:
Use the following constructor to init the controller:
- (instancetype)initWithViewControllerClasses:(NSArray *)classes
andTheirTitles:(NSArray *)titles;
Here are two important porperties:
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;
The usage is very familiar to UITableView
, these are the methods need to implement:
- (NSInteger)numbersOfChildControllersInPageController:(WMPageController *)pageController;
- (__kindof UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index;
- (NSString *)pageController:(WMPageController *)pageController titleAtIndex:(NSInteger)index;
Just implement these datasource methods in YOUR WMPageController after initialize it.
It's easy for you to customize your controller as following, just implement these two datasource methods.
- (CGRect)pageController:(WMPageController *)pageController preferredFrameForContentView:(WMScrollView *)contentView;
- (CGRect)pageController:(WMPageController *)pageController preferredFrameForMenuView:(WMMenuView *)menuView;
When you want to change the frame of contentView, you need to call -forceLayoutSubViews
method. This will recall the datasource method above and re-layout subviews.
If you are interested, see viewFrameExample
for more detail.
1.If you init the WMPageController
with child controller's class,override the -init
method in WMPageController's childViewController
, For example:
- (instancetype)init {
return [self initWithNibName:@"xxxViewController" bundle:nil];
}
2.If you are using datasource, Just implement -pageController:viewControllerAtIndex:
as following:
- (UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"WMViewController"];
return vc;
}
See StoryboardExample
for more detail.
You can easily change style by setting xxxPageController.style = WMMenuViewStyleLine
.
If you want menuView
to show on the navigation bar, set .showOnNavigationBar = YES
;
If you want the newest version, try 2.4.0 (This has some API modified)
pod 'WMPageController', '~> 2.4.0'
If you perfer the old, just use 2.3.0 and it's fine.
pod 'WMPageController', '2.3.0'
If you have any trouble with content controller's frame or size,just try set viewFrame
property, which make you free to customize your own size.
You can put every controller in WMPageController
,But if you want have a UICollectionViewController
in, please have an attention to UICollectionViewController's
init method.
You should override the - init
to give UICollectionViewController
a UICollectionViewLayout
.
Here is an example:
- (instancetype)init {
// init layout here...
self = [self initWithCollectionViewLayout:layout];
if (self) {
// insert code here...
}
return self;
}
This project is under MIT License. See LICENSE file for more information.