React-native: RCTUIImageViewAnimated incompatible with iOS 14

Created on 2 Jul 2020  ·  9Comments  ·  Source: facebook/react-native

Images do not render on iOS 14 beta devices

Please see https://github.com/SDWebImage/SDWebImage/issues/3040 for a discussion.

Looks as if [super displayLayer] needs to be called manually now.

https://github.com/facebook/react-native/blob/ffa07254de914f7876a17ec2d1ecac1dc10b116a/Libraries/Image/RCTUIImageViewAnimated.m#L283

#pragma mark - CALayerDelegate

- (void)displayLayer:(CALayer *)layer
{
  if (_currentFrame) {
    layer.contentsScale = self.animatedImageScale;
    layer.contents = (__bridge id)_currentFrame.CGImage;
  } else {
    [super displayLayer:layer]; // this here!
  }
}

Please provide all the information requested. Issues that do not follow this format are likely to stall.

Description

Please provide a clear and concise description of what the bug is. Include screenshots if needed.
Please test using the latest React Native release to make sure your issue has not already been fixed: https://reactnative.dev/docs/upgrading.html

React Native version:

Run react-native info in your terminal and copy the results here.

System:
OS: macOS 10.15.5
CPU: (16) x64 Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
Memory: 3.83 GB / 32.00 GB
Shell: 5.7.1 - /bin/zsh
Binaries:
Node: 14.5.0 - /usr/local/bin/node
Yarn: Not Found
npm: 6.14.5 - /usr/local/bin/npm
Watchman: Not Found
Managers:
CocoaPods: 1.9.3 - /usr/local/bin/pod
SDKs:
iOS SDK:
Platforms: iOS 13.5, DriverKit 19.0, macOS 10.15, tvOS 13.4, watchOS 6.2
Android SDK:
API Levels: 27, 28, 29
Build Tools: 28.0.3, 29.0.2
System Images: android-24 | Google Play Intel x86 Atom, android-29 | Google Play Intel x86 Atom, android-30 | Google APIs Intel x86 Atom
Android NDK: Not Found
IDEs:
Android Studio: 4.0 AI-193.6911.18.40.6514223
Xcode: 11.5/11E608c - /usr/bin/xcodebuild
Languages:
Java: 1.8.0_232 - /usr/bin/javac
Python: 2.7.16 - /usr/bin/python
npmPackages:
@react-native-community/cli: ^4.10.1 => 4.10.1
react: ^16.13.0 => 16.13.1
react-native: ^0.62.2 => 0.62.2
npmGlobalPackages:
react-native: Not Found

Steps To Reproduce

Provide a detailed list of steps that reproduce the issue.

1.
2.

Expected Results

Describe what you expected to happen.

Snack, code example, screenshot, or link to a repository:

Please provide a Snack (https://snack.expo.io/), a link to a repository on GitHub, or provide a minimal code example that reproduces the problem.
You may provide a screenshot of the application if you think it is relevant to your bug report.
Here are some tips for providing a minimal example: https://stackoverflow.com/help/mcve

Animated Image Needs iOS iOS 14

Most helpful comment

proper fix (so that for example react-native-video also works) would be this (calling super displayLayer always):

#pragma mark - CALayerDelegate

- (void)displayLayer:(CALayer *)layer
{
  if (_currentFrame) {
    layer.contentsScale = self.animatedImageScale;
    layer.contents = (__bridge id)_currentFrame.CGImage;
  }
  [super displayLayer:layer]; // this here!
}

All 9 comments

i found the same issue

proper fix (so that for example react-native-video also works) would be this (calling super displayLayer always):

#pragma mark - CALayerDelegate

- (void)displayLayer:(CALayer *)layer
{
  if (_currentFrame) {
    layer.contentsScale = self.animatedImageScale;
    layer.contents = (__bridge id)_currentFrame.CGImage;
  }
  [super displayLayer:layer]; // this here!
}

Should we wait for 0.63.2? or just manually fix it?

Hello, there is a way to solve it without updating to 0.63.x?

All the shells and script files I organize into scripts directory.

I made the following steps to fix:

  1. Create a file scripts/fix_images_ios_14.sh;
  2. Define the following code:
#!/usr/bin/env bash
echo "🔨️ Fixing Images..."
HUYDEV="_currentFrame.CGImage;"
HUYFIX="_currentFrame.CGImage ;} else { [super displayLayer:layer];"
sed -ie "s/${HUYDEV}/${HUYFIX}/" node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m
echo "✅ Images has been fixed!"
  1. Add script postinstall to package.json i.e: "postinstall": "sh ./scripts/fix_images_ios_14.sh";
  2. Remove node_modules and install packages again with yarn/npm.
  1. Add script postinstall to package.json i.e: "postinstall": "sh ./scripts/fix_images_ios_14.sh";
  2. Remove node_modules and install packages again with yarn/npm.

https://github.com/ds300/patch-package is a good solution for that

  1. "postinstall": "sh ./scripts/fix_images_ios_14.sh";

Its not working on my system Xcode v12 and iOS14

React Native v0.61.4


Updated version with patch-package

  1. Install patch-package into your project patch-package
  2. Add to your package.json in scripts: "postinstall": "patch-package"
  3. Create directory patches and the file react-native+0.61.4.patch inside of it on your root project directory:
diff --git a/node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m b/node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m
index 01aa75f..0337ef1 100644
--- a/node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m
+++ b/node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m
@@ -266,9 +266,11 @@ - (void)displayDidRefresh:(CADisplayLink *)displayLink

 - (void)displayLayer:(CALayer *)layer
 {
-  if (_currentFrame) {
+ if (_currentFrame) {
     layer.contentsScale = self.animatedImageScale;
     layer.contents = (__bridge id)_currentFrame.CGImage;
+  } else {
+    [super displayLayer:layer];
   }
 }
  1. Remove your node_modules and install the packages again.
Was this page helpful?
0 / 5 - 0 ratings