使用iOS 7 API的UICollectionView交互式布局转换

我试图得到新的iOS 7 API的处理,允许交互,animation视图控制器转换,包括UICollectionViewLayout之间的UICollectionViewLayout

我已经从WWDC 2013取得并修改了示例代码,“iOS-CollectionViewTransition”,可以在这里find: https : //github.com/timarnold/UICollectionView-Transition-Demo

最初的演示,当我find它时,它不处于工作状态,可以通过Apple开发者帐户进行访问: https : //developer.apple.com/downloads/index.action?name = WWDC%202013

我的版本的应用程序呈现一个集合视图与两个布局,两个UICollectionViewFlowLayout布局具有不同的属性。

在第一个布局中点击一个单元格可以适当地animation到第二个单元格,其中包括关键点在于正在滚动到新布局的项目。 起初,我对新的集合视图如何知道如何设置其内容偏移量以使适当的单元格可见是困惑的,但我知道这是基于呈现集合视图的selected属性。

在第一个布局中UICollectionViewTransitionLayout项目应该使用UICollectionViewTransitionLayoutUIViewControllerAnimatedTransitioningUIViewControllerInteractiveTransitioninganimation到新的布局。 这可以工作,但是捏住的单元格不会滚动到新的布局或过渡布局中。

我已经尝试设置在不同位置捏的单元格上的selected属性(试图模仿点击一个项目推动新的视图控制器描述的行为),无济于事。

有关如何解决这个问题的任何想法?

您可以在转换过程中自己操作contentOffset ,这实际上比UICollectionView's内置animation提供了更细致的控制。

例如,您可以像这样定义您的转换布局,以在“to”和“from”偏移量之间进行插值。 你只需要根据你想要的结果来计算“to”偏移量:

 @interface MyTransitionLayout : UICollectionViewTransitionLayout @property (nonatomic) CGPoint fromContentOffset; @property (nonatomic) CGPoint toContentOffset; @end #import "MyTransitionLayout.h" @implementation MyTransitionLayout - (void) setTransitionProgress:(CGFloat)transitionProgress { super.transitionProgress = transitionProgress; CGFloat f = 1 - transitionProgress; CGFloat t = transitionProgress; CGPoint offset = CGPointMake(f * self.fromContentOffset.x + t * self.toContentOffset.x, f * self.fromContentOffset.y + t * self.toContentOffset.y); self.collectionView.contentOffset = offset; } @end 

有一件事要注意的是contentOffset会在转换完成时被重置为“from”值,但是您可以通过将其设置回到startInteractiveTransitionToCollectionViewLayout的完成块中的“to”偏移来startInteractiveTransitionToCollectionViewLayout

 CGPoint toContentOffset = ...; [self.collectionViewController.collectionView startInteractiveTransitionToCollectionViewLayout:layout completion:^(BOOL completed, BOOL finish) { if (finish) { self.collectionView.contentOffset = toContentOffset; } }]; 

UPDATE

我在一个新的GitHub库TLLayoutTransitioning中发布了这个实现和一个工作示例。 该示例是非交互式的,旨在演示改进的animation超过setCollectionViewLayout:animated:completion ,但它利用交互式转换API与上述技术相结合。 看一下TLTransitionLayout类,然后尝试运行“示例”工作区中的“resize”示例 。

也许TLTransitionLayout可以完成你所需要的。

更新2

我向TLLayoutTransitioning库添加了一个交互式示例。 尝试运行“示例”工作区中的“捏”示例 。 这个可见的单元格作为一个组。 我正在处理另一个捏住单个单元格的例子,以便在转换过程中单元格跟随您的手指,而其他单元格遵循默认线性path。

更新3

我最近添加了更多的内容偏移放置选项:最小,中心,顶部,左,底部和右。 而transitionToCollectionViewLayout:现在支持Warren Moore的AHEasing库提供的30多种缓动function。