【问题标题】:Take a snapshot of a hidden UIView拍摄隐藏的 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 引起的,但我无法想象这是预期的行为。

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

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

谢谢!

【问题讨论】:

    标签: ios objective-c uiview core-animation


    【解决方案1】:

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

    【讨论】:

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

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

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


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

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

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 2014-12-03
      相关资源
      最近更新 更多