对包括导航栏和选项卡栏的视图进行快照

Taking a snapshot of a view including the navigation bar and the tab bar

我正在尝试实现自定义导航控制器转换。转换完成后,fromVC 应该在 toVC 后面可见,因此效果应该看起来像 toVC 出现在 fromVC 之上,部分覆盖它。

因此,为了达到效果,我使用 fromView 的快照并在 animateTransitioning(using:) 方法中将其作为子视图插入到 containerView

 snapshot = fromVC.view.snapshotView(afterScreenUpdates: false)
 containerView.addSubview(self.snapshot!)

但是,问题在于此快照不包括 navigation bartab bar。我找到了一些建议使用 UIGraphicsGetImageFromCurrentImageContext() 的答案,但是这个 returns 是 UIImage。我需要快照是 UIView 才能将其作为子视图插入到 containerView 中。我可以使用它并使用 UIImageView 手动创建一个 UIView 并将其作为子视图插入,但我担心,这对转换来说太 "heavy" 操作了。

如果您知道如何实现,我将不胜感激。

既然 fromVC 当前在屏幕上,为什么不这样做:

let snapshot = UIScreen.main.snapshotView(afterScreenUpdates: false)

这将使用 navigationBartabBarstatusBar

拍摄整个屏幕的快照

这将快照并展开根视图,其中包括除状态栏之外的所有内容:

guard let snap = UIApplication.shared.keyWindow!.snapshotView(afterScreenUpdates: true) else {
    return  
}