在UICollectionView中将一个特定单元格放在其他单元格之上

时间:2012-11-19 01:06:50

标签: ios ios6

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

2 个答案:

答案 0 :(得分:0)

我有同样的需要

具体来说,我想基于所选集合视图中的单元格呈现模态视图控制器。当您查看库时,您可以在iBooks中看到这种行为。从集合中选择一本“书”,然后“弹出”并打开书。

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

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

我有下面的示例代码,但有几点需要注意:

  • 我将IVARS用于动画状态信息,因为我在实际实现中使用了多种方法中的信息
  • 由于我的代码所做的额外转换,我也在使用QuartzCore 3D转换,这超出了本答案的范围。
  • 我在我的单元格中添加了一个“动画”属性,以便在动画期间改变它的外观(因此它可以更好地扩展)
  • 最后,我在本例中最后切换代码进行标准模式演示,而不是调用我在实际应用中为实际启动场景中下一个VC而执行的非标准演示控制器< / LI>

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

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

答案 1 :(得分:0)

这非常简单。只需将单元格添加到集合视图的滚动视图中,然后再将其展开到其他视图上,然后在不再需要它时将其删除。下面我已经完成了这个,然后在每个单元格上添加了一个动画,让它在其他单元格上方展开。为了简单起见,我把动画留了下来。

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
}