如何快速搭建iOS三栏折叠导航:PaperFoldNavigationController完整指南
【免费下载链接】PaperFold-for-iOSPaper folding animation for iOS项目地址: https://gitcode.com/gh_mirrors/pa/PaperFold-for-iOS
PaperFold-for-iOS 是一款经典的 iOS 纸张折叠动画控件库,其PaperFoldNavigationController让你用极少代码就能搭建出三栏控制器式折叠导航:拖动中间内容区,左右两个 View Controller 就像折纸一样展开和收拢。本文将从零带你跑通官方 NavDemo 示例,并讲清每个关键参数。
为什么选择三栏控制器式折叠导航?
常见的 iOS 侧滑菜单(如UISegmentedControl或第三方抽屉库)大多是"整体平移"效果,而 PaperFold 的卖点在于真实的纸张折叠视觉:
- 📄 折叠时会对侧栏视图做屏幕截图并分段折叠,模拟纸张弯曲
- 💡 内置虚拟光源:朝向左侧的折面更暗,立体感强
- 🧩 三栏结构:中间主内容 + 左侧栏 + 右侧栏,均可挂载任意
UIViewController
三栏结构一览
PaperFoldNavigationController本质上是一个容器UIViewController,内部封装了核心动画视图PaperFoldView,并持有三个子控制器,定义见 PaperFoldNavigationController.h:
| 角色 | 属性 | 说明 |
|---|---|---|
| 中间栏 | rootViewController | 主内容区,占满全屏 |
| 左侧栏 | leftViewController | 左滑展开,折叠次数固定为 3 折 |
| 右侧栏 | rightViewController | 右滑展开,折叠次数、拉动系数可自定义 |
一键搭建:官方NavDemo的5步用法
完整示例位于 PaperFold-NavDemo/AppDelegate.m,核心搭建流程如下:
第 1 步:创建中间主控制器
把内容页(如UITableView)包进UINavigationController,作为 root:
ContentViewController *contentVC = [[ContentViewController alloc] initWithStyle:UITableViewStylePlain]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:contentVC];第 2 步:初始化 PaperFoldNavigationController 并设为根控制器
PaperFoldNavigationController *foldNav = [[PaperFoldNavigationController alloc] initWithRootViewController:nav]; self.window.rootViewController = foldNav;第 3 步:挂载左侧栏(固定宽度 150pt)
LeftViewController *leftVC = [[LeftViewController alloc] init]; UINavigationController *leftNav = [[UINavigationController alloc] initWithRootViewController:leftVC]; [leftNav setNavigationBarHidden:YES]; [foldNav setLeftViewController:leftNav width:150];第 4 步:挂载右侧栏(宽度 250pt,3 折,拉动系数 0.9)
RightViewController *rightVC = [[RightViewController alloc] init]; UINavigationController *rightNav = [[UINavigationController alloc] initWithRootViewController:rightVC]; [rightNav setNavigationBarHidden:YES]; [foldNav setRightViewController:rightNav width:250.0 rightViewFoldCount:3 rightViewPullFactor:0.9];第 5 步:运行—— 左右拖动中间表格,即可看到折叠动画。
💡 侧栏控制器同样可以
push新页面,NavDemo 中三个表格点击后都会pushViewController,说明折叠栏内保留了完整导航能力,见 LeftViewController.m。
关键API速查:两个设置方法的区别
| API | 行为 | 适用场景 |
|---|---|---|
setLeftViewController:width: | 内部固定foldCount:3, pullFactor:0.9 | 简单侧边菜单,一步到位 |
setRightViewController:width:rightViewFoldCount:rightViewPullFactor: | 可自定义折叠段数与拉开节奏 | 需要更"绵长"折叠感的宽面板 |
foldCount(折叠次数):侧栏被拆分成几段纸折,段数越多动画越有层次感pullFactor(拉动系数,0~1):控制远离中心折段的展开速度,值越小远处折段跟随越慢,"多米诺"感越强
对应实现可参考 PaperFoldNavigationController.m,底层最终调用PaperFoldView的setLeftFoldContentView:foldCount:pullFactor:。
生命周期回调:折叠状态变了怎么办?
PaperFoldNavigationController自动实现PaperFoldViewDelegate,在每次折叠状态切换时帮你转发viewWillAppear/viewDidAppear等生命周期方法,见 PaperFoldNavigationController.m。三种状态:
PaperFoldStateDefault—— 收起,回到中间栏PaperFoldStateLeftUnfolded—— 左侧栏展开PaperFoldStateRightUnfolded—— 右侧栏展开
这意味着你不需要手动管理三个控制器的生命周期,子控制器里的viewDidAppear:等业务逻辑会按预期触发(NavDemo 的 RightViewController.m 中就有日志验证)。
如果想在代码中主动展开/收起(不依赖手势),可直接操作paperFoldView属性,调用setPaperFoldState:PaperFoldStateLeftUnfolded等方法,接口定义见 PaperFoldView.h。
常见问题与最佳实践
- 中间栏是表格,手势冲突?可关闭对应方向的拖拽:
[self.paperFoldView setEnableLeftFoldDragging:NO] - ARC 要求:本库依赖 ARC,非 ARC 项目需给源文件加
-fobjc-arc编译参数(详见 PaperFold.podspec 的依赖声明) - 集成方式:支持 CocoaPods(
pod 'PaperFold'),也可直接把PaperFold/PaperFold/PaperFold目录下的源码拖入工程 - 侧栏宽度建议:iPhone 上左侧 150~200pt、右侧 200~280pt 视觉效果最佳,可按机型自适应调整
小结
PaperFoldNavigationController用"三控制器 + 两行配置"的模式,把复杂的纸张折叠动画封装成了接近零成本的功能:中间栏承载业务主流程,左右栏作为可折叠辅助面板,生命周期全自动管理。如果你希望 iOS 应用的导航少一些"平移菜单"的千篇一律,这套三栏控制器式折叠导航方案值得放进你的工具箱。
【免费下载链接】PaperFold-for-iOSPaper folding animation for iOS项目地址: https://gitcode.com/gh_mirrors/pa/PaperFold-for-iOS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考