UICollectionview 非并行动画

Posted

技术标签:

【中文标题】UICollectionview 非并行动画【英文标题】:UICollectionview non parallel animation 【发布时间】:2013-12-19 08:50:16 【问题描述】:

我的问题简而言之:this effect on UICollectionView 怎么实现?

我有一个带有类似于网格布局的自定义布局的集合视图。现在,当我进入 collectionview 控制器时,我希望单元格有一个漂亮的动画。

我知道我可以实现 - initialLayoutAttributesForAppearingItemAtIndexPath: 等并在 collectionview 上调用 performBatchUpdates。现在,当我这样做时,所有动画都是并行执行的(比如调用 UIView animate)。在许多应用程序中,我看到了在 iPhone 上的 philips hue 应用程序中没有并行完成的效果,效果可以在顶部发布的电影中看到。我可以想到的一件事是,不是在此处插入所有对象,而是分别添加行,因此例如,所有行都在彼此相邻的某个间隔后循环和分派。

无论如何,如果有人能提示我实现这种效果的最佳方法是什么,或者知道做类似事情的样本,我将不胜感激。

【问题讨论】:

如您所见,UICollectionView 不允许您直接控制动画的持续时间。你可能想看看[CALayer setSpeed],它可以让你改变任何层的动画速度。请注意,这也会改变所有子图层的动画速度,所以要小心。请阅读此答案以获取更多信息:***.com/questions/18250049/… 我知道,但这通常会改变速度,因此所有项目仍将以相同的速度进行动画处理,只是比苹果为我们决定的快一点或慢一点。我真正想知道的是电影中的效果是如何实现的。 【参考方案1】:

这是一种方法:(写完后我觉得有点脏……但它有效)

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    myCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    cell.myPic.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",indexPath.row]];

    CGRect frame = cell.myPic.frame;

    frame.origin.y = cell.myPic.frame.origin.y + 40;
    cell.myPic.frame = frame;
    cell.myPic.alpha = 0;

    [cells addObject:cell];

    return cell;


- (IBAction)Run:(UIButton *)sender

    for (int i=0; i<[cells count]; i++)
    
        myCell *cell = [cells objectAtIndex:i];            

        [UIView animateWithDuration:0.15 animations:^() 
            CGRect frame = cell.myPic.frame;
            frame.size.width = 80;
            frame.origin.y = cell.myPic.frame.origin.y - 40;
            cell.myPic.frame = frame;
            cell.myPic.alpha = 1;            

        completion:^(BOOL finished)];
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]];
    

【讨论】:

非常感谢!我了解您“不太喜欢”此选项,但我确实可以解决问题,这可能是从集合视图中获取可见单元格而不是将它们添加到 cellForItemAtIndexPath 中的数组的好选择,但我绝对可以工作有了这个! 没问题。使用NSRunLoop 对我来说总是感觉像是在违背自然,但在极少数情况下(例如这种情况)使用它几乎没有害处。

以上是关于UICollectionview 非并行动画的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionViewCell 展开动画

UICollectionView,按钮未出现

从 uiviewcontroller 操作 uicollectionviewcell 内的 uicollectionview

UICollectionView CompositionalLayout 不调用 UIScrollDelegate

UICollectionView 布局在滚动时表现异常

UICollectionView 作为子视图不会更新约束