CubeController 1.2.1

CubeController 1.2.1

测试已测试
Lang语言 Obj-CObjective C
许可 zlib
发布最后发布2014年12月

Nick Lockwood 维护。



  • 作者:
  • Nick Lockwood

目的

CubeController 是 UIViewController 子类,可用于创建旋转 3D 立方体导航。CubeController 使用熟悉的 dataSource 协议模式来加载其子视图控制器,易于设置和使用。

支持的操作系统与 SDK 版本

  • 支持的构建目标 - iOS 7.0 (Xcode 5.0, Apple LLVM 编译器 5.0)
  • 最早支持的部署目标 - iOS 5.0
  • 最早兼容的部署目标 - iOS 4.3

注意:'支持' 意味着库与这个版本进行了测试。'兼容' 意味着库应该在该操作系统版本上运行(即它不依赖于任何不可用的 SDK 特性),但是不再对其进行兼容性测试,可能需要调整或错误修复才能正确运行。

ARC 兼容性

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。

UIViewController 扩展

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:方法程序化滚动时,会调用此方法。