在我的UICollectionView中,其中一个单元格包含一个动画将离开单元格的边界,现在它被附近的其他单元格所覆盖。是否可以将这个特殊的单元格放在其他单元格之上,这样它可以完美呈现动画? 感谢。
答案 0 :(得分:0)
我有同样的需要
具体来说,我想基于所选集合视图中的单元格呈现模态视图控制器。当您查看库时,您可以在iBooks中看到这种行为。从集合中选择一本“书”,然后“弹出”并打开书。
简单地“按原样”缩放单元格可能会使其被其他单元格覆盖,这是不可取的。
要使其工作,您只需记住单元格的超级视图(它可能不是直接的UICollectionView!)及其原始中心点。然后将其从超级视图中删除,将其添加到主视图中(可选择将其添加到前面),执行动画。在完成块中,将变换重置为Identity(无变换),将其从主视图中删除,然后将其添加回原始父节点和中心点。
我有下面的示例代码,但有几点需要注意:
您可能还需要进行其他调整,但我上面概述的基本技术肯定会有效。
// 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
}