CubeController 是 UIViewController 子类,可用于创建旋转 3D 立方体导航。CubeController 使用熟悉的 dataSource 协议模式来加载其子视图控制器,易于设置和使用。
注意:'支持' 意味着库与这个版本进行了测试。'兼容' 意味着库应该在该操作系统版本上运行(即它不依赖于任何不可用的 SDK 特性),但是不再对其进行兼容性测试,可能需要调整或错误修复才能正确运行。
CubeController 需要 ARC。如果你希望在不支持 ARC 的项目中使用 CubeController,只需将 -fobjc-arc 编译器标志添加到 CubeController.m 类中。要这样做,前往目标设置中的“构建阶段”标签,打开“编译源代码”组,在列表中双击“CubeController.m”,然后在新弹出的窗口中输入 -fobjc-arc。
如果你希望将你的整个项目转换为 ARC,在 CubeController.m 中注释掉 #error 行,然后在 Xcode 中运行“编辑 > 重构 > 转换为 Objective-C ARC...”工具,并确保你需要使用 ARC 的所有文件都已勾选(包括 CubeController.m)。
CubeController 从 UIViewController 派生而来,且与所有 UIKit 组件一样,只能从主线程访问。
要在应用中使用 CubeController 类,只需将 CubeController 类文件(示例文件和资源文件不需要)拖放到你的项目中,并添加 QuartzCore 框架(或在“构建设置”中启用“自动链接框架”)。
CubeController 有以下属性
@property (nonatomic, weak) id<CubeControllerDataSource> dataSource;
一个支持 CubeControllerDataSource 协议的对象,可以提供视图控制器来填充 CubeController。
@property (nonatomic, weak_delegate) id<CubeControllerDelegate> delegate;
一个支持 CubeControllerDelegate 协议的对象,可以响应 CubeController 的事件。
@property (nonatomic, readonly) UIScrollView *scrollView;
这是 CubeController 内部使用的 UIScrollView。将其暴露出来,以便您可以轻松配置弹跳、加速度等属性。请注意,覆盖某些 scrollView 属性会导致 CubeController 行为不正确。
@property (nonatomic, readonly) NSInteger numberOfViewControllers;
在CubeController中显示的控制器数量(只读)。要设置此属性,请实现 dataSource中的numberOfViewControllersInCubeController:
方法。注意,通常在某个时间点只能看到一个或最多两个这种控制器可见。
@property (nonatomic, assign) NSInteger currentViewControllerIndex;
当前最前面控制器的索引。设置此值相当于调用scrollToViewControllerAtIndex:animated:
方法并将animated参数设置为NO。
@property (nonatomic, getter = isWrapEnabled) BOOL wrapEnabled;
该属性启用循环。如果设置为YES,则CubeController可以围绕一个圆圈旋转。如果设置为NO,则当滚动到第一个或最后一个索引时,控制器将停止。
CubeController类具有以下方法
- (void)reloadData;
此方法将刷新CubeController中所有可见控制器的状态。
- (void)reloadViewControllerAtIndex:(NSInteger)index animated:(BOOL)animated;
此方法刷新指定的控制器。可以应用一个可选的淡入淡出动画。如果指定的视图控制器尚未加载(不在屏幕上),则此方法不执行任何操作。
- (void)scrollToViewControllerAtIndex:(NSInteger)index animated:(BOOL)animated;
这将旋转CubeController到指定的视图控制器索引,要么立即旋转,要么平滑地动画旋转。指定的索引将被范围检查并适当循环,因此可以安全地传递范围0 - numberOfViewControllers之外的价值。
- (void)scrollForwardAnimated:(BOOL)animated;
- (void)scrollBackAnimated:(BOOL)animated;
这些方法通过旋转一个步长(90度)向前或向后移动CubeController。
CubeController扩展了UIViewController,具有以下属性
@property (nonatomic, readonly) CubeController *cubeController;
此属性可以作为方便的方式访问任何视图控制器的父CubeController。这类似于UIViewController的navigationController或tabBarController属性。如果控制器当前不在CubeController内部,则此属性将为nil。
CubeController遵循苹果公司用于数据驱动的视图的约定,提供两个协议接口,CubeControllerDataSource和CubeControllerDelegate。CubeControllerDataSource协议有以下必要方法
- (NSInteger)numberOfViewControllersInCubeController:(CubeController *)cubeController;
返回CubeController中的视图控制器数量。
- (UIViewController *)cubeController:(CubeController *)cubeController viewControllerAtIndex:(NSInteger)index;
返回一个在CubeController中指定索引处显示的UIViewController。
CubeControllerDelegate协议有以下可选方法
- (void)cubeControllerDidScroll:(CubeController *)cubeController;
当CubeController滚动时调用此方法。无论CubeController是通过程序滚动还是通过用户交互滚动,都会调用此方法。
- (void)cubeControllerCurrentViewControllerIndexDidChange:(CubeController *)cubeController;
每当CubeController滚动得足够远,以至于currentViewControllerIndex属性需要更改时调用此方法。无论索引是程序更新还是通过用户交互更新,都会调用此方法。
- (void)cubeControllerWillBeginDragging:(CubeController *)cubeController;
当CubeController开始移动以响应用户拖动时,会调用此方法。
- (void)cubeControllerDidEndDragging:(CubeController *)cubeController willDecelerate:(BOOL)decelerate;
当用户停止拖动CubeController时调用此方法。willDecelerate参数表示CubeController是否需要减速停下(即当前索引不一定是它将要停在的位置)或会停在当前位置。注意,即使willDecelerate为NO,CubeController也将继续自动滚动,直到它与当前索引完全对齐。
- (void)cubeControllerWillBeginDecelerating:(CubeController *)cubeController;
当用户停止拖动CubeController后,CubeController即将开始减速时,会调用此方法。
- (void)cubeControllerDidEndDecelerating:(CubeController *)cubeController;
当CubeController完成减速,并且可以假设currentViewControllerIndex在这一点上的值是最终停止值时,会调用此方法。
- (void)cubeControllerDidEndScrollingAnimation:(CubeController *)cubeController;
当CubeController完成移动后,使用scrollToViewControllerAtIndex:
方法程序化滚动时,会调用此方法。