1

在我的 UICollectionView 中,其中一个包含动画的单元格将超出单元格的边界,现在它被附近的其他单元格覆盖。是否可以将这个特殊的单元格放在其他单元格之上,从而完美呈现动画?谢谢。

4

2 回答 2

0

我也有同样的需要

具体来说,我想根据所选集合视图中的单元格呈现一个模式视图控制器。当您查看图书馆时,您可以在 iBooks 中看到这种行为。从收藏中选择一本“书”,它会“弹出”并打开书本。

简单地“按原样”缩放单元格可能会被其他单元格覆盖,这是不可取的。

要让它工作,您只需记住单元格的超级视图(它可能不是直接的 UICollectionView!)及其原始中心点。然后你把它从它的超级视图中移除,把它添加到你的主视图中(可以选择把它放在前面),执行你的动画。在完成块中,将您的转换重置为身份(无转换),将其从主视图中删除,并将其添加回其原始父级和中心点。

我有下面的示例代码,但有一些警告:

  • 我将 IVARS 用于动画状态信息,因为我在实际实现中使用多种方法中的信息
  • 由于我的代码所做的其他转换超出了此答案的范围,我还在使用 QuartzCore 3D 转换
  • 我在我的单元格中添加了一个“动画”属性,让它在动画期间改变它的外观(所以它会更好地缩放)
  • 最后,我在这个例子的最后切换了我的代码来做一个标准的模态演示,而不是调用我在我的实际应用程序中所做的非标准演示控制器来实际启动场景中的下一个 VC

您可能还需要进行其他调整,但我上面概述的基本技术肯定会起作用。

// Assume: UIView *cell  == cell we are animating
// Assume: UIViewController *vc == View controlelr we will launch
// Assume: IVAR CGPoint _animationCellOrigCenter
// Assume: IVAR UIView *_animationCellParent
// Assume: IVAR UIView *_animationCell;

// Save "before" state before animating:
_animationCellOrigCenter = cell.center;
_animationCellParent = cell.superview;
_animationCell = cell;

// Where is the cell currently in the main view?
CGPoint cellViewLoc = [self.view convertPoint:_animationCellOrigCenter fromView:_animationCellParent];

// OK. Hoist the cell into the main view:
[cell removeFromSuperview];
cell.center = cellViewLoc;
[self.view addSubview:cell];
[self.view bringSubviewToFront:cell];

CGSize cellSize = cell.bounds.size;
CGSize newSize = CGSizeMake(600,600); // YMMV

[cell.superview bringSubviewToFront:cell];

// Get ready to do some animating:
CGSize viewSize = collectionView.bounds.size;
CGPoint destination = CGPointMake(viewSize.width / 2, viewSize.height / 2);
CGFloat scaleX = newSize.width / cellSize.width;
CGFloat scaleY = newSize.height / cellSize.height;
cell.animating = YES;

[UIView animateWithDuration:.2
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
                 animations:^{
                     cell.layer.transform = CATransform3DMakeScale(scaleX, scaleY, 1);
                     cell.center = destination;
                 }
                 completion:^(BOOL finished) {
                     [self presentViewController:vc
                                        animated:YES
                                      completion:^{
                                          // Put everything back the way we found it!
                                          [_animationCell removeFromSuperview];
                                          [_animationCellParent addSubview:_animationCell];
                                          _animationCell.center = _animationCellOrigCenter;
                                          _animationCell.layer.transform = CATransform3DIdentity;
                                          _animationCell.animating = NO;
                                      }
                    ];
                }
 ];
于 2013-01-16T14:01:36.077 回答
0

这是相当简单的。只需将单元格添加到 collectionview 的滚动视图中,然后再将其展开到其他单元格之上,然后在您不再希望它位于顶部时将其删除。下面我已经完成了这个,然后在每个单元格本身上添加了一个动画,让它在其他单元格之上展开。为了简单起见,我把那个动画去掉了。

override func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {
    let cell = collectionView.cellForItemAtIndexPath(indexPath)

    self.collectionView?.addSubview(cell!)

    return true
}

override func collectionView(collectionView: UICollectionView, shouldDeselectItemAtIndexPath indexPath: NSIndexPath) -> Bool {

    let cell = collectionView.cellForItemAtIndexPath(indexPath)
    if (cell?.superview != nil) {
        cell?.removeFromSuperview()
    }

    return true
}
于 2015-12-02T20:05:01.500 回答