为啥我的图像(本地资产或下载的资产)没有在 iOS 14 上显示,而是在使用 ReactNative 0.62.x 的 Android 上显示?

Posted

技术标签:

【中文标题】为啥我的图像(本地资产或下载的资产)没有在 iOS 14 上显示,而是在使用 ReactNative 0.62.x 的 Android 上显示?【英文标题】:Why my image (local assets or downloaded assets) is not showing on iOS 14 but showing on Android using ReactNative 0.62.x?为什么我的图像(本地资产或下载的资产)没有在 iOS 14 上显示,而是在使用 ReactNative 0.62.x 的 Android 上显示? 【发布时间】:2020-12-03 06:28:06 【问题描述】:

我的 ReactNative 项目在 0.61.x 版本上运行良好,升级到 0.62.x 版本后仍然运行良好。但过了一段时间,项目的图像开始不显示,无论是在模拟器上还是在真实设备上。奇怪的是,与此同时,我的团队在同一个项目上工作,使用相同的存储库和分支,我们都在做一个干净的 repo 库,他的模拟器显示图像,而我的仍然不是,不管我做什么。然而,今天,他的模拟器开始出现同样的症状,而这正是在他更新了 Xcode 之后。

【问题讨论】:

【参考方案1】:

过去我一直无法找到解决方案,但现在我发现 some answers 对我有用。所以我把这个 QnA 作为像我这样有类似问题的人的灯塔。

从答案来看,问题似乎是由 ios 14 更改引起的。

更新 IOS 14.x 后,生成的图像未显示是一个问题。这是一些反对的信息。添加[super displayLayer:layer]后可以显示图像;如果 _currentFrame 为零。如果我理解正确的话,_currentFrame 应该是动画图像,所以如果是静止图像,我们可以使用 UIImage 实现来处理图像渲染,不确定它是否正确。

有问题的文件位于:

node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m

解决办法是手动更改RCTUIImageViewAnimated.m里面的代码:

if (_currentFrame) 
    layer.contentsScale = self.animatedImageScale;
    layer.contents = (__bridge id)_currentFrame.CGImage;
   else 
    [super displayLayer:layer];
  

但这意味着每次您重新安装完整节点时,更改都会被覆盖。所以其他答案提到您可以将该修复添加到 podfile 中,以便在您运行 pod install 时自动运行。

pre_install do |installer|
  puts("Image fix for ios14: remove this when upgradeing to >= 0.63.3")
  find = "_currentFrame.CGImage;"
  replace = "_currentFrame.CGImage ; else  [super displayLayer:layer];"
  op = `sed -ie "s/#find/#replace/" ../node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m`
  puts("Image fix for ios14 done")
end

然后运行 ​​pod install。

我确认此修复对我有效。

注意:请注意,此修复仅适用于低于 0.63.3 的 ReactNative 版本。升级到 0.63.3 后,您可以删除这些代码行。

【讨论】:

【参考方案2】:

当我升级到iOS 14 时遇到了同样的问题。

我在以下步骤中找到了解决方法。

https://github.com/facebook/react-native/issues/29279#issuecomment-658244428

目前处于失败状态,但非常最佳解决方案

缺点是每次安装node_modules时都必须更新文件

【讨论】:

是的。这就是为什么在某些答案中,它将修复程序合并到 podfile 脚本中,因此您只需要在 npm install 之后调用 pod install 。

以上是关于为啥我的图像(本地资产或下载的资产)没有在 iOS 14 上显示,而是在使用 ReactNative 0.62.x 的 Android 上显示?的主要内容,如果未能解决你的问题,请参考以下文章

强制本地化图像或图像资产

在 React Native 中保存和共享项目资产中的图像

iOS 图像设计(尺寸和资产目录)

iOS:资产目录中的启动图像上的黑线

如何让 Flutter 的 webview 处理从本地 html 加载的本地资产?

Android Google Maps v2 从资产中的图像加载 OverlayTile