UICollectionViewTransitionLayout - 模仿iOS7照片集合视图布局

时间:2013-09-23 11:09:32

标签: ios uicollectionview uicollectionviewlayout

我正在guidelines上阅读Apples animating changes in a collection view,尝试模仿照片应用。选择图像时,图像会从其位于集合视图中的区域“增长”为全尺寸视图。

Apple注意到使用UICollectionViewLayout对象但对我来说它看起来非常混乱,并且全尺寸图库中的最终图像不可见,因为动画集中在集合视图上。

我的代码如下

-(void)setHorizontalLayout:(BOOL)layout
{
    if (layout == YES)
    {


        UICollectionViewTransitionLayout *layout =[self.collectionView startInteractiveTransitionToCollectionViewLayout:[self getHorizontalPagingLayout] completion:^(BOOL completed, BOOL finish) {
            [self.collectionView setPagingEnabled:YES];
        }];

        [self.collectionView.collectionViewLayout invalidateLayout];
        layout.transitionProgress = 0.1;
        double delayInSeconds = 0.1;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [self updateLayout:layout];
            //[self.collectionView.collectionViewLayout invalidateLayout];
            //[self.collectionView finishInteractiveTransition];

        });
        [self.collectionView.collectionViewLayout invalidateLayout];
        return;
}
}

-(void)updateLayout:(UICollectionViewTransitionLayout *)layout
{
    if (layout.transitionProgress >= 1.0)
    {

        [self.collectionView finishInteractiveTransition];
        return;
    }
    double delayInSeconds = 0.05;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        layout.transitionProgress += 0.005;
        [self.collectionView.collectionViewLayout invalidateLayout];
        [self updateLayout:layout];
    });

}

2 个答案:

答案 0 :(得分:0)

如何使用自定义转换呈现带有UIImageView的UIViewController?本教程帮助了我。

http://www.teehanlax.com/blog/custom-uiviewcontroller-transitions/

答案 1 :(得分:0)

我知道照片实际上使用布局来布局UICollectionViewController(useLayoutToLayoutNavigationTransitions上的导航转换,以便在从一个时间到几年等时实现动画(2013年的会话218,如果我没有记错的话)

当你试图在不同数据源的集合视图之间进行转换时,事情变得非常有趣。 Objc.io的章节为此写了一篇精美的文章。

但是,如果你想要实现捏开效果,它实际上要比它看起来简单得多。

简而言之,我们假设我们只想从集合视图中为单元格设置动画,以扩展为全屏视图控制器。在这种情况下,您需要做的就是实现一个自定义视图控制器转换,您可以有效地将转换应用到FullScreenPhotosViewController,使其从单元格的点开始。然后我们简单地将变换设置为全屏幕。

一旦你有时间使它成为交互式的,这一步骤的技巧是在开始转换时隐藏集合视图单元格,因为你想为全屏幕控制器而不是单元格设置动画(如果你不是t隐藏它然后细胞仍然可见,它看起来会令人困惑)。所以基本上你现在握在你手指下的单元格实际上是FullScreenPhotosViewController,你的捏合驱动变换,原始单元格被隐藏。展开控制器时,您将更新完成百分比,以便导航栏在转换过程中更新。

如果你想了解更多细节,我可以包括当我到电脑时如何计算变换等?