拍摄隐藏的 UIView 的快照

Posted

技术标签:

【中文标题】拍摄隐藏的 UIView 的快照【英文标题】:Take a snapshot of a hidden UIView 【发布时间】:2014-09-16 14:21:43 【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

【讨论】:

不错的解决方案!非常优雅和简单【参考方案2】:

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

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


您也可以尝试归档然后取消归档视图(实质上是复制它):

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

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


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

【讨论】:

以上是关于拍摄隐藏的 UIView 的快照的主要内容,如果未能解决你的问题,请参考以下文章

如何拍摄未呈现的 UIView 的快照?

UIview 的快照不显示圆弧和圆角

需要从 Android“概览屏幕”中隐藏程序内容

在 ios7 中拍摄状态栏的快照

是否可以捕获 DOM 快照 [重复]

在 UIView 中隐藏非子 UIView