问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

react native ios 怎么引用原生ui组件的属性

发布网友 发布时间:2022-04-25 12:53

我来回答

2个回答

热心网友 时间:2022-05-13 21:10

需要React Native已经提供了不少的UI控件,但有时仍然需要将我们自定义的UI控件集成到React Native中,本文已ImageView为例,将ImageView集成到React里,使JS可以使用Android ImageView
Native view是通过继续ViewManager的子类创建和管理的,React Native里提供了SimpleViewManager子类,可以方便使用,SimpleViewManager已经提供了一些基本属性如背景色,透明度,Flexbox布局相关的封装。
步骤:
创建ViewManager子类
实现createViewInstance方法
使用@ReactProp注解声明JS可以访问的属性方法
注册ViewManager
实现JavaScript组件
创建ViewManager子类
public class MyReactImageManager extends SimpleViewManager<ImageView> {
public static final String REACT_CLASS = "MyRCTImageView";

//返回的名字用于在JavaScript中引用此View type
@Override
public String getName(){
return REACT_CLASS;
}
...
}12345678910

实现createViewInstance方法
@Override
public ImageView createViewInstance(ThemedReactContext context){
return new ImageView(context);
}1234

使用@ReactProp声明JS里使用的属性
使用@ReactProp(或@ReactPropGroup)注解定义一些在JavaScript里使用的属性的setter方法。
属性设置方法的第一个参数为当前View类型(本例中为ImageView),第二个参数为为属性值。设置方法应该声明为public void类型
当前支持的属性类型:boolean, int, float, double, String, Boolean, Integer, ReadableArray, ReadableMap
注解@ReactProp有一个类型为String的name参数。JS里将会通过注解里的这个name来调用这个设置方法。
除了name属性外,@ReactProp还有其它可选属性:defaultBoolean, defaultInt, defaultFloat(对应boolean, int, float)。当js里没有显示指定此值时就会使用此值。default值目前只支持基本类型,对于其它复杂类型,默认值为null
//使用@ReactProp或@ReactPropGroup声明一些在Javascript里可以使用的setter方法
@ReactProp(name = "src")
public void setSrc(final ImageView view, @Nullable final String src){
new Thread(new Runnable() {
@Override
public void run() {
final Bitmap bitmap = getBitmap(src);
view.post(new Runnable() {
@Override
public void run() {
view.setImageBitmap(bitmap);
}
});
}
}).start();
}

@ReactProp(name = ViewProps.RESIZE_MODE)
public void setResizeMode(ImageView view, @Nullable String resizeMode){
ImageView.ScaleType scaleType = ImageView.ScaleType.CENTER;

if ("contain".equals(resizeMode)) {
scaleType = ImageView.ScaleType.CENTER_INSIDE;
}
...

view.setScaleType(scaleType);
}12345678910111213141516171819202122232425262728

注册ViewManager
@Override
public List<ViewManager> createViewManagers( ReactApplicationContext reactContext)
{
return Arrays.<ViewManager>asList( new ReactImageManager() );
}12345

实现JavaScript mole
// ImageView.js

var { requireNativeComponent, PropTypes } = require('react-native');

var iface = {
name: 'ImageView',
propTypes: {
src: PropTypes.string,
resizeMode: PropTypes.oneOf(['cover', 'contain', 'stretch']),
},
};

mole.exports = requireNativeComponent('RCTImageView', iface, {nativeOnly:{
'scaleX': true,
'scaleY': true,
'testID': true,
'decomposedMatrix': true,
'backgroundColor': true,
'accessibilityComponentType': true,
'renderToHardwareTextureAndroid': true,
'translateY': true,
'translateX': true,
'accessibilityLabel': true,
'accessibilityLiveRegion': true,
'importantForAccessibility': true,
'rotation': true,
'opacity': true,
}});12345678910111213141516171819202122232425262728

在JavaScript中使用上这个UI控件
//引入这个模块
var ImageView = require('./ImageView.js');

...
render() {
return (
<View style={styles.container}>
...
<ImageView src= "http://i.imgur.com/UePbdph.jpg" resizeMode = "stretch" style = {styles.thumbnail}/>
</View>
)
}123456789101112

期间遇到的错误
在ImageView.js里导出模块时mole.exports = requireNativeComponent(‘RCTImageView’, iface)
遇到‘ImageView’ has no propType for native prop ‘RCTImageView.scaleX’ of native type ‘number’

原因:所使用的基类SimpleViewManager里定义了大量@ReactProp属性声明,这些属性需要在js模块里需要声明。
解决方法:,在requireNativeComponent里带上第三个参数,将所有的属性指定一下
mole.exports = requireNativeComponent('RCTImageView', iface, {nativeOnly:{
'scaleX': true,
...
}});
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 现在前端怎么样?React-Native 需求量大吗 react native跟什么框架开发 reactnative 有ui框架吗 React Native有什么UI框架可以使用吗? 儿童汽车安全座椅怎么拆开清洗 WEY P8安装儿童座椅要注意什么 第一次安装安全座椅,需要把原来的车座椅拆掉吗? 大众朗逸儿童安全座椅怎么安装 有人知道Babysing安全座椅怎么拆卸吗?清洗的时候可以拆下来清洗吗? 哈弗H7l儿童座椅的安装方法是什么? 加盟一家本宫的茶奶茶店需要注意哪些问题? 在广州加盟哪个奶茶店比较好 支付宝如何拒收别人转的钱 安全座椅怎么安装 求问,阿水大杯茶里的毒药奶茶怎么做的 儿童座椅清洗后怎么安装 奈雪的茶加盟费多少钱?总部在哪里 柯迪亚克儿童座椅接口怎么拆 奶茶的好处与坏处? 儿童安全座椅要怎么拆卸下来图片 如何构建 react native 工程 ios React-Native-Android怎么封装原生组件 大连703路公交车线路图 从山屏街到泉水客运服务中心怎么坐公交车,最快需要 大连开发区城润万家去山屏街怎么走(公交) vivox5怎么设置微信透明背景 从山屏街到星海,医大=院,坐什么车就近 vivo x21 怎么不能设置微信透明头像? 大连公交车路线 大连从山屏街到正工街怎公交坐几路 oppo手机怎么设置微信透明的皮肤? 大连从山屏街到森林动物园一期的公交线路,如何倒车 南沙街95号我在山屏街坐哪路公交车 大连的公交车线路 所有大连公交路线 vivox5微信怎么设置透明的头像啊? 从大连中医院到中山区中南路205号有几路公交车? 大连泰达美爵酒店附近的公交车有什么 谁知道去大连市国家税务局乘车路线 大连老虎滩附近的公交车有哪些?