在 SceneKit 中播放 GIF 后,iOS 应用程序 UI 冻结

Posted

技术标签:

【中文标题】在 SceneKit 中播放 GIF 后,iOS 应用程序 UI 冻结【英文标题】:IOS app UI freeze after playing GIF in SceneKit 【发布时间】:2020-06-14 16:31:40 【问题描述】:

我已经创建了检测图像的 AR 应用,在检测到图像后,我想在它上面播放 gif。

我按照这个教程来检测图像:https://www.raywenderlich.com/6957-building-a-museum-app-with-arkit-2

在 VC 中我像这样添加了 Imageview:

  var imageView = GIFImageView(frame: CGRect(x: 0, y: 0, width: 600, height: 600))

这是我在 ARSCNViewDelegate didAdd 节点中用于方法的代码。

  func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) 
DispatchQueue.main.async  self.instructionLabel.isHidden = true 
if let imageAnchor = anchor as? ARImageAnchor 
  //      handleFoundImage(imageAnchor, node)

  let size = imageAnchor.referenceImage.physicalSize

  DispatchQueue.main.async() // If we remove this we are getting UIview setAnimation is being call from background thread error is coming.
    self.imageView.animate(withGIFNamed: "tenor.gif") // I actually access gif from Document folder i.e Data format
  
  let imgMaterial = SCNMaterial()

  imgMaterial.diffuse.contents = imageView

  let imgPlane = SCNPlane(width: size.width, height: size.height)

  imgPlane.materials = [imgMaterial]

  let imgNode = SCNNode(geometry: imgPlane)
  imgNode.eulerAngles.x = -.pi / 2

  node.addChildNode(imgNode)
  node.opacity = 1


播放 gif 后,当我回到上一个/下一个/相同的 VC 时,我无法点击任何 UI 元素(按钮等)。

在控制台中我看到了这个,但我没有找到解决方案。视图动画在 UIImage+gif swift 文件中。

从后台线程调用 UIView setAnimationsEnabled。不支持从后台线程对 UIView 或子类执行任何操作,这可能会导致意外和隐蔽行为

只需在设备中运行它。 https://drive.google.com/file/d/1FKHPO6SkdOEZ-w_GFnrU5CeeeMQrNT-h/view?usp=sharing

您只需在设备中运行此项目并扫描恐龙.png 图像(添加 ion xcode),您将在其上播放 gif。一旦你回到firstVC,所有的应用程序都被冻结了,你不能点击First VC中的任何按钮,你也不能再次启动AR场景。 我无法弄清楚为什么在播放 GIF 后会发生这个问题,你能检查一下并告诉我。

如果有什么需要请告诉我。提前谢谢。

【问题讨论】:

【参考方案1】:

ios 处理GIF有点烦人,因此我使用mp4资源代替Gif,可以直接加载到AVPlayer中。

在您的情况下,我看到您在 Bundle 中有资源,因此您可以将它们转换为 mp4 并改用它。

要在 SceneKit 中播放视频,您可以使用此链接 How do I create a looping video material in SceneKit on iOS in Swift 3?。

【讨论】:

您好,在这个解决方案中,他们没有提到播放透明背景视频,所以我打算在没有BG的情况下播放gif。在播放 GIF 之前,在当前实现中一切正常,一旦我退出 GIF 播放应用程序 UI 冻结并在控制台中显示 - > UIView setAnimationsEnabled 从后台线程调用。即使我添加了 DispatchQueue.main.async 但没有工作,我也没有找到它的解决方案。 嗨,兄弟,GIF 我可以使用 GIFU 库正常播放,但由于该应用程序 ui 冻结,在我的控制台中看到此问题。你能帮我解决这个问题吗? 从后台线程调用 UIView setAnimationsEnabled。不支持从后台线程对 UIView 或子类执行任何操作,这可能会导致意外和阴险的行为 首先检查问题的出处,在您的架构上启用主线程检查器,在附加调试器的情况下运行它,看看是什么触发了它。我在第一次加载时遇到了与 SceneKit 类似的问题,主线程检查器正在检测问题,但在我的情况下,这是一个苹果错误,它只在调试而不是在发布模式下重现。 Bro 主线程检查器已启用架构,(在附加调试器的情况下运行它,看看是什么触发了它。)-> 表示我在 iPad 设备上运行的应用程序它在控制台中给出了同样的问题.实际上我没有使用任何线程来播放 gif,但它在 SceneKit 中显示了这个问题。我正在使用 Xcode 11.3 那是苹果的错误吗?无法确定在后台线程上调用 UIView setAnimation 的位置。 在 XCode11 中,点击主线程检查器附近的箭头,它会添加一个断点,当检查器被触发时,它将被触发。检查调用堆栈以查看它的来源,这里有更多关于如何使用主线程检查器进行调试的信息***.com/questions/44943995/…

以上是关于在 SceneKit 中播放 GIF 后,iOS 应用程序 UI 冻结的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scenekit 场景时间在 iOS 中擦洗动画

如何防止 SceneKit 动画在加载时立即播放?

在 SceneKit 中播放视频的最佳方式是啥?

iOS FLAnimatedImage控制Gif播放次数

iOS FLAnimatedImage控制Gif播放次数

C# Windows 窗体中的 WMP 在显示 GIF 后停止播放声音