拍摄隐藏的UIView的快照

时间:2014-09-16 14:21:44

标签: ios objective-c uiview core-animation

我正在尝试拍摄隐藏视图的快照,但遇到了几个问题。如果我尝试快速取消隐藏它,拍摄快照,然后重新隐藏它,我有时会在屏幕上快速闪烁,这是非常刺耳的。

toCollectionViewCell.hidden = NO;
UIView *toPlaceHolderSnapshot = [toCollectionViewCell resizableSnapshotViewFromRect:toCollectionViewCell.bounds afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero];
toCollectionViewCell.hidden = YES;

我很确定闪烁是由afterScreenUpdates引起的:是的,但我无法想象这是预期的行为。

我也尝试将单元格/视图移出屏幕而不是隐藏它,但我无法确定该单元格何时可能会被重新加载并因此过早地移回其位置。

有没有办法拍摄隐藏视图的快照或更聪明的方法来实现这一目标?我在自定义过渡动画期间需要此功能,我将集合视图单元格从集合视图中拉出,然后在关闭时将其返回到原位。我正在拍摄前/后状态的快照,然后在动画期间在两者之间进行转换。

谢谢!

2 个答案:

答案 0 :(得分:7)

向视图层次结构添加额外的容器视图。隐藏容器将具有相同的视觉效果,但您可以轻松地对容器的内容进行快照。

答案 1 :(得分:0)

  

我也尝试将单元格/视图移出屏幕而不是隐藏它,但我无法确定该单元格何时可能会被重新加载并因此过早地移回其位置。

这种方法可能是最简单的。只要您在主线程上完成所有工作,单元格就不会在快照期间移动。


您还可以尝试归档然后取消归档视图(基本上复制它):

id copyOfView = 
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
UIView *viewCopy = (UIView *)copyOfView;
viewCopy.hidden = NO;

(层次结构中的所有视图都需要符合NSCoding协议。)


最后,您可以将单元格绘制为UIImage,然后将其显示在UIImageView中。 Sample code here