如何将视图导出到React Native中的图像数据

Der*_*Hsu 3 react-native

我正在尝试导出ViewReact Native中的渲染图形.例如,我的观点是:

<View> <Image/> // Some image <Rectangle /> // Some little <Circle /> // Some circle </View>

如何从容器中提取渲染的图形View为任何图像数据格式?

Der*_*Hsu 5

请参阅/sf/answers/2235556151/

  1. 子类RCTView和添加export方法:

MyCoolView.m:

- (NSData *)export
{
  UIGraphicsBeginImageContext(self.bounds.size);
  [self.layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return UIImagePNGRepresentation(image);
}
Run Code Online (Sandbox Code Playgroud)
  1. export在本机视图管理器中公开该方法:

关键是传入reactTag哪个是对本机组件的引用.

MyCoolViewManager.m:

RCT_EXPORT_METHOD(export:(NSNumber *)reactTag callback:(RCTResponseSenderBlock)callback) {
  [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) {
    MyCoolView *view = viewRegistry[reactTag];
    if (![view isKindOfClass:[MyCoolView class]]) {
      RCTLogMustFix(@"Invalid view returned from registry, expecting MyCoolView, got: %@", view);
    }
    NSData * imageData = [view export];
    callback(@[[NSNull null], [imageData base64EncodedStringWithOptions:0]]);
  }];
}
Run Code Online (Sandbox Code Playgroud)
  1. export从React组件中公开方法:

MyCoolView.js:

var React = require('react-native');
var NativeModules = require('NativeModules');
var MyCoolViewManager = NativeModules.MyCoolViewManager;
var findNodeHandle = require('findNodeHandle');

class MyCoolView extends React.Component{
    // ...
    export() {
        return new Promise((resolve, reject) => {
            MyCoolViewManager.export(
                findNodeHandle(this),
                (error, result) => {
                    if (error) {
                        reject(error);
                    } else {
                        resolve(result);
                        // now we've got the base64 encoded data of the exported image
                    }
                }
            );
        });
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 调用export方法:

该组件看起来像这样:

<MyCoolView ref='myCoolView'>
    <Image />
        <Rectangle />
        <Circle />
    </View>
</MyCoolView>
Run Code Online (Sandbox Code Playgroud)

在某些功能:

this.refs.myCoolView.export()
    .then(base64data => {
        console.log(base64data);
    }, error => {
        console.error(error);
    });
Run Code Online (Sandbox Code Playgroud)