为啥我的图像(本地资产或下载的资产)没有在 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 上显示?的主要内容,如果未能解决你的问题,请参考以下文章