适用于分页内容的无限滚动和视觉变更协调构造。
查看 示例应用。
RAPageViewController
RAPageViewController
是通过视图控制器容器构建的,并使用内部的 UIScrollView
。它公开了两个公共属性
@property (nonatomic, readwrite, weak) IBOutlet id<RAPageViewControllerDelegate> delegate;
@property (nonatomic, readwrite, strong) IBOutletCollection(UIViewController) NSArray *viewControllers;
将类的工作委托连接到对应的输出,以便按预期工作。否则,它可能仍然显示 viewControllers
中的一个视图控制器,但这可能不会很有用。
<RAPageViewControllerDelegate>
您将找到这些方法
- (UIViewController *) pageViewController:(RAPageViewController *)pvc viewControllerBeforeViewController:(UIViewController *)vc;
- (UIViewController *) pageViewController:(RAPageViewController *)pvc viewControllerAfterViewController:(UIViewController *)vc;
…这基本上是您需要提供给 UIPageViewController
的相同内容。
同样,您可以在 示例应用 中找到一个快捷且实用的实现。在那里也免费实现了页面间距:应用附带了 RAPVCSViewController
,展示了通过重写 -viewRectForPageRect:
和加载视图时调整内部滚动视图来填充视图的方式。
RAPageCollectionViewController
如果您将支持动态数据集,那么您应该使用这个控制器。
想象一下,如果您正在使用与 NSFetchedResultsController
配合的核心数据栈,并接收更改通知
以上所述
@property (nonatomic, readwrite, weak) id<RAPageCollectionViewControllerDelegate> delegate;
@property (nonatomic, readonly, strong) UICollectionView *collectionView;
@property (nonatomic, readonly, strong) UICollectionViewFlowLayout *collectionViewLayout;
更多信息,请查看示例应用!RAPVCSCollectionViewController 显示了几个方法的示例实现,这些方法涵盖了基本操作
rewind
:移动到第一页。fastForward
:移动到最后页。insertBefore
:在当前页之前插入页面。insertAfter
:在当前页之后插入页面。trash
:删除当前页面。RAPageCollectionViewController
尽可能地将布局计算的工作委托给收集视图,并使用现有构造来提供更新钩子。
它需要委托出口,并询问以下关键信息
总共有多少页?
这允许控制器准备可滚动区域。
索引为 index
的视图控制器是什么?
它们将动态查询,提供重新使用(甚至)视图控制器的机会,以避免为永远不会可见的页面进行昂贵的全局实例化。
再次强调——《RAPageCollectionViewController》的目的是提供一个高效、灵活的方式来展示有限的内容集,便于变更协调。您不能在没有至少知道数据点数量的情况下使用它来滚动非常大的数据集,这确实是一个缺陷,但大多数现有的数据集展示模式都需要索引,并在项目总数发生变化时更新整个世界。
作为免费内容,让我们假设你想确切地知道当前显示的是哪一页,以及该页的偏移量是多少。你想获取比NSUInteger
更细粒度的信息。
@property (nonatomic, readwrite, assign) CGFloat displayIndex; // if no pages, it’ll be NAN, use isnan()
- (void) setDisplayIndex:(CGFloat)displayIndex animated:(BOOL)animate completion:(void(^)(void))completionBlock;
displayIndex
以浮点数的形式提供了关于当前页面的高度细粒度信息。
这至少对我的一种用例非常有用。 :)
<RAPageCollectionViewControllerDelegate>
在这里你需要提供所有数据
- (NSUInteger) numberOfViewControllersInPageCollectionViewController:(RAPageCollectionViewController *)pageCollectionViewController;
- (UIViewController *) viewControllerForPageAtIndex:(NSUInteger)index inPageCollectionViewController:(RAPageCollectionViewController *)pageCollectionViewController;
该项目属于公有领域。您可以使用它并在您出售的应用程序中嵌入它,您也可以使用它做坏事。不过,如果您能通过链接到项目页面(https://github.com/evadne/RAPage ViewController)来提供署名,那就更好了。