8

我正在阅读 Apple关于在集合视图中设置动画更改的指南,试图模仿照片应用程序。选择图像时,图像会从其在 collectionview 中所在的区域“增长”到完整尺寸的视图。

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];
    });

}
4

2 回答 2

0

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

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

于 2014-02-04T16:17:31.653 回答
0

我知道照片实际上使用布局来布局 UICollectionViewController 上的导航过渡(useLayoutToLayoutNavigationTransitions以在从瞬间到几年等时实现动画(如果我没记错的话,2013 年的第 218 次会议)

话虽如此,当您尝试在具有不同数据源的集合视图之间进行转换时,事情会变得非常有趣。Objc.io的小伙子为此写了一篇漂亮的文章。

但是,如果您希望实现捏合打开效果,它实际上比看起来要简单得多。

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

一旦你有时间让它交互,这一步的技巧是在你开始转换时隐藏集合视图单元格,因为你想要动画全屏控制器而不是单元格(如果你不隐藏它那么该单元格仍然可见,并且看起来很混乱)。因此,基本上您现在握在手指下的单元格实际上是 FullScreenPhotosViewController,您的捏拉驱动变换,原始单元格被隐藏。当您展开控制器时,您会更新完成百分比,以便导航栏与转换一起更新。

如果您想要更多详细信息,我可以包括当我使用计算机时如何计算转换等?

于 2014-07-16T18:21:31.167 回答