Swift 3 / 为啥快照视图中的快照在 iPhone 7 Plus 模拟器中显示为空白?

Posted

技术标签:

【中文标题】Swift 3 / 为啥快照视图中的快照在 iPhone 7 Plus 模拟器中显示为空白?【英文标题】:Swift 3 / Why does the snapshot from snapshotView appears blank in iPhone 7 Plus Simulator?Swift 3 / 为什么快照视图中的快照在 iPhone 7 Plus 模拟器中显示为空白? 【发布时间】:2016-10-22 03:43:54 【问题描述】:

我正在使用以下代码来创建自定义菜单转换。我花了两个小时试图弄清楚为什么快照显示为空白(仅使用 iPhone 7 Plus 模拟器)。但是当我想为这个线程创建一个视频并将其制作成 gif 时,它在我的 iPhone 6S Plus 上运行

更新:也适用于 iPhone 6S 模拟器。但在 7 Plus 中仍然没有。

import UIKit

class PresentMenuAnimator : NSObject 


extension PresentMenuAnimator : UIViewControllerAnimatedTransitioning 
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval 
        return 0.6
    

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) 

        let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)
        let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)
        let containerView = transitionContext.containerView
        containerView.insertSubview((toVC?.view)!, belowSubview: (fromVC?.view)!)

        // replace main view with snapshot
        let snapshot = fromVC?.view.snapshotView(afterScreenUpdates: false)
        snapshot?.tag = MenuHelper.snapshotNumber
        snapshot?.isUserInteractionEnabled = false
        snapshot?.layer.shadowOpacity = 0.7
        containerView.insertSubview(snapshot!, aboveSubview: (toVC?.view)!)
        fromVC?.view.isHidden = true

        UIView.animate(
            withDuration: transitionDuration(using: transitionContext),
            animations: 
                snapshot!.center.x += UIScreen.main.bounds.width * MenuHelper.menuWidth
            ,
            completion:  _ in
                fromVC?.view.isHidden = false
                transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
            
        )
    

iPhone 6S Plus(物理设备)iOS 10

iPhone 7 Plus(模拟器)iOS 10

为什么模拟器上的快照是空白的?

GitHub test project

【问题讨论】:

我已尝试运行该项目,它在 6s 模拟器 (14A345) 上运行良好 iPhone 7 Plus sim? 14A345 也适用于 6s 模拟器。刚试过。但 7 加,不是 This thread 建议这只发生在模拟器中,而不是在真正的 iPhone 7 设备上。 对这个案子也很好奇。找到原因了吗? 【参考方案1】:

替代解决方案,

添加这个UIView 扩展,

public extension UIView 
    public func snapshotImage() -> UIImage? 
        UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)
        drawHierarchy(in: bounds, afterScreenUpdates: false)
        let snapshotImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return snapshotImage
    

    public func snapshotView() -> UIView? 
        if let snapshotImage = snapshotImage() 
            return UIImageView(image: snapshotImage)
         else 
            return nil
        
    

更新您的以下代码,

let snapshot = fromVC?.view.snapshotView(afterScreenUpdates: false)

与,

let snapshot = fromVC?.view.snapshotView()

Ref

【讨论】:

这并不能完全回答为什么 snapshotview(afterScreeUpdates:) 不起作用的问题,只是提供了一种替代解决方案。您知道为什么该方法不起作用吗?我遇到了同样的问题 是的..也是同样的问题......而且绘制成图像很慢......所以我也想知道问题是什么...... 谢谢@Zaid,但你知道为什么它与 snapshotView(afterScreenUpdates:) 如此不同吗???很高兴了解更多信息 是否有任何关于为什么会发生这种情况的更新?我找不到任何关于为什么此方法可能返回 nil 对不起,我不知道原始问题的原因,这只是上面写的替代解决方案。

以上是关于Swift 3 / 为啥快照视图中的快照在 iPhone 7 Plus 模拟器中显示为空白?的主要内容,如果未能解决你的问题,请参考以下文章

将 arkit 快照直接保存到照片库 swift 4

在 Swift 3 中包含字典的 Firebase 进程子快照

iOS swift UICollectionviewcell 快照错误

在 Swift 中从 TableView 拖放到另一个视图

将 Firebase 快照投射到 Swift 3 对象

使用 Swift 遍历 Firebase 中的嵌套快照子项