Rect Native小坑

ListView 标签流式布局

contentContainerStyle={styles.listContainer}
listContainer:{
flexDirection:'row',
flexWrap:'wrap',
},

这种方式只能实现类似标签的高度相等,宽度不同的布局,不能实现高度不同,宽度相同的瀑布流布局
row的最外层需要设置确定的高度

ListView 瀑布流

row设置为绝对布局,计算位置

renderRow执行的次数比dataSource的数量少

如果出现renderRow执行的次数比dataSource的数量少的情况,
需要设置:
initialListSize={20} // 可以把值改为dataSource的length
如果不设置,renderRow只能执行前几条数据, 想显示其他数据, 只能通过改变任意state来实现

得到text的高度

<Text onLayout={(event)=>this._textOnLayout(event)} />

_textOnLayout(event){
    console.log(event.nativeEvent.layout.height,'onLayout');
}

ListView从下向上排列

<ListView contentContainerStyle={styles.listViewContent}/>
listViewContent:{
    flex:1,
    //从下向上排列
    justifyContent:'flex-end'
}

得到组件宽高

this.refs.row.measure(function(ox,oy,width,height,px,py){
    cellHeight=height;
});

<View style={styles.row} ref="row"/>

row:{
    flex:1,
    backgroundColor:'#FFFFFF',
    borderTopWidth:1/2,
    borderBottomWidth:1/2,
    borderColor:'#dddddd',
    marginTop:10/2,
    marginBottom:10/2
},

指定某个组件

var _listView: ListView;
<ListView ref={(listView)=>{_listView=listView;}}/>

版本更新

openAppStore: ()=> {
  var url = '';
  if (Platform.OS === 'ios') {
    url = 'itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&onlyLatestVersion=true&pageNumber=0&sortOrdering=1&id=1156814163';
  } else {
    url = 'http://a.app.qq.com/o/simple.jsp?pkgname=com.girtu.girtu'
  }

  Linking.openURL(url).catch(err => console.error('An error occurred', err));
},

checkoutUpdate: ()=> {
  let setLaterUpdateTime = (time) => {
    AsyncStorage.setItem('update_time', time);
  }

  let getLaterUpdateTime = () => {
    return AsyncStorage.getItem('update_time')
  }

  // 点击了稍后更新, 保存当前时间
  let laterUpdate = ()=> {
    setLaterUpdateTime(new Date().toString())
  }

  // 点击立即下载只是跳转到商店,本地不做处理,如果没有更新,下次进入依然提醒
  // 点击稍后下载,本地记录时间,10天后再次提醒
  let showAlert = ()=> {
    Alert.alert('有新版本发布, 是否更新', '', [
      {text: '马上下载', onPress: ()=>module.exports.openAppStore()},
      {text: '稍后更新', onPress: ()=>laterUpdate()}
    ])
  }

  // 计算时间差, 如果大于10天就显示alert, 否则什么都不做
  let calculateDateDiff = (oldDate)=> {
    oldDate = new Date(oldDate)
    let newDate = new Date(); //结束时间
    let differDate = newDate.getTime() - oldDate.getTime(); //时间差的毫秒数
    let days = Math.floor(differDate / (24 * 3600 * 1000)); ////计算出相差天数
    if(days >= 10) {
      showAlert()
    }
  }

  setTimeout(()=> {
    // 假设获取到版本号后
    let newVersion = '2.3.3';
    let oldVersion = DeviceInfo.getVersion();
    if (newVersion > oldVersion) {
      getLaterUpdateTime()
        .then((oldDate)=> {
          // 如果有时间就计算时间差, 没有时间就直接显示
          if (oldDate) {
            calculateDateDiff(oldDate)
            // calculateDateDiff(1489075200000)
          } else {
            showAlert()
          }
        })
        .catch((e)=> {
          showAlert()
        })
    }
  }, 2000)
},

navigationBar颜色渐变

// 参数格式为#ffffff 或者 #ffffff00
function hexToRGBA(hex) {
  var a = 1
  if (hex.length == 9) {
    a = parseInt(hex.substr(7, 2), 16) / parseInt('ff', 16)
  }

  let r = parseInt(hex.substr(1, 2), 16)
  let g = parseInt(hex.substr(3, 2), 16)
  let b = parseInt(hex.substr(5, 2), 16)

  let rgba = `rgba(${r}, ${g}, ${b}, ${a})`
  return {
    string: rgba,
    r,
    g,
    b,
    a
  }
}

updateProgress(progress, fromIndex, toIndex) {
  var routes = this.props.navState.routeStack
  var fromRoute = routes[fromIndex]
  var toRoute = routes[toIndex]

  let {navColor} = fromRoute

  if (fromRoute.navColor != toRoute.navColor) {
    let fromRGBA = utils.hexToRGBA(fromRoute.navColor)
    let toRGBA = utils.hexToRGBA(toRoute.navColor)
    const {r: toR, g: toG, b: toB, a: toA} = toRGBA
    const {r: fromR, g: fromG, b: fromB, a: fromA} = fromRGBA
    let minusR = toR - fromR
    let minusG = toG - fromG
    let minusB = toB - fromB
    let minusA = toA - fromA

    let r = toR - minusR * (1 - progress)
    let g = toG - minusG * (1 - progress)
    let b = toB - minusB * (1 - progress)
    let a = toA - minusA * (1 - progress)

    navColor = `rgba(${r}, ${g}, ${b}, ${a})`

    this.setState({
      progressStyle: {
        ...this.state.progressStyle,
        backgroundColor: navColor,
      }
    })
  }

  this._nav && this._nav.updateProgress(progress, fromIndex, toIndex)
}

旋转rotate

let iwidth = util.size.width;
let iheight = iwidth / mediaInfo.width * mediaInfo.height

// 如果是旋转过的图片,重新计算
let rotate = ??; // 角度 字符串
if (rotate == '90' || rotate == '270') {
   iheight = util.size.width
   iwidth = iheight * (mediaInfo.width / mediaInfo.height)
   let translateXY = (iwidth > iheight ? 1 : -1 ) * (Math.abs(iwidth - iheight) / 2)
   translateXY *= (rotate == '90' ? 1 : -1 )

    return (
        <View style={{
            position: 'absolute',
            left: 0,
            top: 0,
            width: iwidth, // 如果90度或者270度,宽高需要反过来,因为是先旋转再设置宽高
            height: iheight,
            transform: [
                {rotate: `${rotate}deg`},
                {translateX: translateXY},
                {translateY: translateXY}
            ]}}
        />
   );
 } else {
    return (
        <View style={{
            position: 'absolute',
            left: 0,
            top: 0,
            width: iwidth,
            height: iheight,
            transform: [
                {rotate: `${rotate}deg`},
            ]
            }]}
        />
   )
 }

子view上下拉伸

justifyContent: 'space-between',
alignSelf: 'stretch'

WebView自动获取高度

在html中监听高度的变化,把title设置为高度,当title变化时,会触发WebView的onNavigationStateChange方法,获取到高度。

<WebView
    {...this.props}
    source={{html: `<!DOCTYPE html><html><body>${this.props.htmlBody}<script>window.onload=function(){window.location.hash = 1;document.title = document.body.clientHeight;}</script></body></html>`}}
    javaScriptEnabled={true}
    style={[{height: this.state.height}, this.props.style]}
    scrollEnabled={false}
    automaticallyAdjustContentInsets={true}
    contentInset={{top:0,left:0}}
    onNavigationStateChange={(info)=>{
      if (info.title) {
        this.setState({
           height: parseInt(info.title) + 20
         })
       }
     }}
/>

画三角

// 画三角。style:
triangle: {
    width: 0,
    height: 0,
    borderStyle: 'solid',
    borderWidth: 8,
    marginTop: -8,
    borderTopColor: 'transparent',//下箭头颜色
    borderLeftColor: 'transparent',//右箭头颜色
    borderBottomColor: Colors.BACKGROUND_GRAY,//上箭头颜色
    borderRightColor: 'transparent'//左箭头颜色
},

iOS图片更新不及时显示新图片的解决办法

bug产生的原因:iOS的Image更换uri不会马上清空显示的内容,而是加载成功后才替换,所以在加载过程中依然显示旧图片。
解决:

  1. 从Image加载的角度不好解决,所以要让Image重新创建,就要从ListView下手,而ListView更新已存在的row只是刷新,不是重新创建
  2. react为组件提供了key属性,用于同级别的组件根据key的不同来优化渲染,原理就是如果key相同就刷新,key不同就重新创建
  3. 在ListView的renderRow的最外层component添加key属性,设置为当然数据的唯一id,就可以在更新时重新创建Image,(不可以设置为row的索引,没有任何对优化的帮助而且会造成不可预料的问题)
  4. 进一步优化,重新创建item会造成多余的开销,而现在只需要更新Image,所以renderRow的component去掉key属性,给Image添加key属性,设置为url,解决。

RN iOS图片缓存位置

APP路径/Library/Caches/[Bundle ID]/fsCachedData

引入装饰器

npm i --save-dev babel-plugin-transform-decorators-legacy
修改.babelrc

{
    "presets": ["react-native"],
    "plugins": ["transform-decorators-legacy"]
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容