WMPageController数据源与代理方法完全解析:掌握所有回调时机 WMPageController数据源与代理方法完全解析掌握所有回调时机【免费下载链接】WMPageControllerAn easy solution to page controllers like NetEase News项目地址: https://gitcode.com/gh_mirrors/wm/WMPageControllerWMPageController是一个轻量级的iOS页面控制器解决方案类似于网易新闻的页面切换效果。它提供了灵活的数据源和代理方法让开发者能够轻松实现复杂的页面切换逻辑和交互效果。本文将详细解析WMPageController的数据源和代理方法帮助开发者掌握所有回调时机打造流畅的页面切换体验。WMPageController简介WMPageController是一个基于UIScrollView实现的页面控制器支持左右滑动切换页面顶部有一个菜单视图用于快速切换页面。它提供了丰富的自定义选项包括菜单样式、页面缓存策略、预加载策略等满足不同场景的需求。数据源方法详解数据源方法用于向WMPageController提供必要的数据包括子控制器数量、子控制器实例、标题等。1. 子控制器数量- (NSInteger)numbersOfChildControllersInPageController:(WMPageController *)pageController;该方法用于指定WMPageController中包含的子控制器数量。返回值为NSInteger类型表示子控制器的数量。2. 子控制器实例- (__kindof UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index;该方法用于为指定索引的位置提供子控制器实例。参数index表示子控制器的索引返回值为UIViewController或其子类的实例。3. 标题- (NSString *)pageController:(WMPageController *)pageController titleAtIndex:(NSInteger)index;该方法用于为指定索引的子控制器提供标题标题将显示在顶部菜单视图中。参数index表示子控制器的索引返回值为NSString类型的标题。4. 内容视图 frame- (CGRect)pageController:(WMPageController *)pageController preferredFrameForContentView:(WMScrollView *)contentView;该方法用于自定义内容视图子控制器的父视图的frame。参数contentView为内容视图实例返回值为CGRect类型的frame。5. 菜单视图 frame- (CGRect)pageController:(WMPageController *)pageController preferredFrameForMenuView:(WMMenuView *)menuView;该方法用于自定义菜单视图的frame。参数menuView为菜单视图实例返回值为CGRect类型的frame。代理方法详解代理方法用于监听WMPageController的各种事件如页面切换、滚动进度等以便开发者进行相应的处理。1. 懒加载子控制器- (void)pageController:(WMPageController *)pageController lazyLoadViewController:(__kindof UIViewController *)viewController withInfo:(NSDictionary *)info;当子控制器首次显示且滚动停止时调用该方法。可以在该方法中对子控制器进行一些耗时的初始化操作。参数viewController为当前显示的子控制器info为包含索引、标题等信息的字典。2. 即将缓存子控制器- (void)pageController:(WMPageController *)pageController willCachedViewController:(__kindof UIViewController *)viewController withInfo:(NSDictionary *)info;当子控制器即将被缓存时调用该方法。可以在该方法中清理子控制器中不需要的数据。参数viewController为即将被缓存的子控制器info为包含索引、标题等信息的字典。3. 即将进入子控制器- (void)pageController:(WMPageController *)pageController willEnterViewController:(__kindof UIViewController *)viewController withInfo:(NSDictionary *)info;当子控制器即将进入用户视野时调用该方法。可以在该方法中进行一些准备工作。参数viewController为即将进入的子控制器info为包含索引、标题等信息的字典。4. 完全进入子控制器- (void)pageController:(WMPageController *)pageController didEnterViewController:(__kindof UIViewController *)viewController withInfo:(NSDictionary *)info;当子控制器完全显示在用户视野中且滚动停止时调用该方法。可以在该方法中进行一些需要在页面完全显示后执行的操作。参数viewController为完全显示的子控制器info为包含索引、标题等信息的字典。实际应用示例下面通过一个简单的示例来演示如何使用WMPageController的数据源和代理方法。1. 实现数据源方法#pragma mark - WMPageControllerDataSource - (NSInteger)numbersOfChildControllersInPageController:(WMPageController *)pageController { return 3; } - (UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index { UIViewController *vc [[UIViewController alloc] init]; switch (index) { case 0: vc.view.backgroundColor [UIColor redColor]; break; case 1: vc.view.backgroundColor [UIColor greenColor]; break; case 2: vc.view.backgroundColor [UIColor blueColor]; break; default: break; } return vc; } - (NSString *)pageController:(WMPageController *)pageController titleAtIndex:(NSInteger)index { return [NSString stringWithFormat:页面%d, index 1]; } - (CGRect)pageController:(WMPageController *)pageController preferredFrameForContentView:(WMScrollView *)contentView { return CGRectMake(0, 64, self.view.bounds.size.width, self.view.bounds.size.height - 64); } - (CGRect)pageController:(WMPageController *)pageController preferredFrameForMenuView:(WMMenuView *)menuView { return CGRectMake(0, 20, self.view.bounds.size.width, 44); }2. 实现代理方法#pragma mark - WMPageControllerDelegate - (void)pageController:(WMPageController *)pageController lazyLoadViewController:(UIViewController *)viewController withInfo:(NSDictionary *)info { NSInteger index [info[index] integerValue]; NSLog(懒加载页面%d, index 1); } - (void)pageController:(WMPageController *)pageController willEnterViewController:(UIViewController *)viewController withInfo:(NSDictionary *)info { NSInteger index [info[index] integerValue]; NSLog(即将进入页面%d, index 1); } - (void)pageController:(WMPageController *)pageController didEnterViewController:(UIViewController *)viewController withInfo:(NSDictionary *)info { NSInteger index [info[index] integerValue]; NSLog(完全进入页面%d, index 1); }3. 创建WMPageController实例WMPageController *pageController [[WMPageController alloc] init]; pageController.dataSource self; pageController.delegate self; pageController.titleColorSelected [UIColor redColor]; pageController.titleColorNormal [UIColor blackColor]; pageController.menuViewStyle WMMenuViewStyleLine; [self addChildViewController:pageController]; [self.view addSubview:pageController.view]; [pageController didMoveToParentViewController:self];高级用法1. 缓存策略WMPageController提供了多种缓存策略可通过cachePolicy属性设置WMPageControllerCachePolicyDisabled: 禁用缓存WMPageControllerCachePolicyNoLimit: 无限制缓存WMPageControllerCachePolicyLowMemory: 低内存缓存WMPageControllerCachePolicyBalanced: 平衡缓存WMPageControllerCachePolicyHigh: 高缓存2. 预加载策略WMPageController支持预加载机制可通过preloadPolicy属性设置WMPageControllerPreloadPolicyNever: 不预加载WMPageControllerPreloadPolicyNeighbour: 预加载相邻页面WMPageControllerPreloadPolicyNear: 预加载附近2个页面3. 菜单样式WMPageController的菜单视图支持多种样式可通过menuViewStyle属性设置WMMenuViewStyleDefault: 默认样式WMMenuViewStyleLine: 下划线样式总结WMPageController提供了丰富的数据源和代理方法让开发者能够轻松实现复杂的页面切换逻辑和交互效果。通过本文的介绍相信大家已经对WMPageController的数据源和代理方法有了全面的了解。在实际开发中可根据具体需求灵活使用这些方法打造出更加流畅、美观的页面切换体验。希望本文能够帮助大家更好地理解和使用WMPageController。如果您有任何问题或建议欢迎在评论区留言交流。【免费下载链接】WMPageControllerAn easy solution to page controllers like NetEase News项目地址: https://gitcode.com/gh_mirrors/wm/WMPageController创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考