美文网首页锻炼吃饭的家伙iOS开发在iOS开发的道路上越走越远
iOS页面动态化,怎么样用JSON数据的原生页面摆脱低效的H5页

iOS页面动态化,怎么样用JSON数据的原生页面摆脱低效的H5页

作者: Kobe_Dai | 来源:发表于2017-04-27 23:32 被阅读5855次

    最近花了几天时间研究了一下怎么用iOS原生页面高效的更新app页面样式,我的思路是使用仿H5样式的JSON数据,利用各种布局(流动,线性等布局)来动态更新页面样式。

    页面动态化主要的使用场景是app的电商页面,由于电商的业务需求较大,经常会需要改变各个banner的样式来满足业务的需求,所以需要客户端根据数据实时更新样式,下面说说我对页面动态化的理解跟思路。先看一下最后demo的效果:

    2017-04-27 18_34_37.gif

    其他app是怎么做的

    用Charles抓包,发现京东跟网易考拉都是用type这个字段提前定义好各种banner的样式,通过后台返回的数据,来实现页面动态化更新,这样做有好的方面也有不好的地方:

    • 好的方面:提前定义好banner的样式,客户端只需要定义好各个样式的UI,根据type字段来展现就好
    • 不好的方面:只能根据定义好的样式来进行动态化更新,如果需要加入新的样式,需要提交新包

    我的做法

    客户端不定义banner样式,而是定义布局样式来实现高度动态更新页面,思路来自于CSS里定义的div+CSS布局,CSS里可以根据display的inline跟block值来进行布局,iOS里,我定义了几种常见的布局:

    • <b>FlowLayout</b>:流式布局,根据display值横向或者纵向布局,根据屏幕宽度跟banner宽度换行
    • <b>LinearLayout</b>:线性布局,纵向布局
    • <b>WaterfallLayout</b>:瀑布流布局
    • <b>OneAndNLayout</b>:左边一个大图,右边N张小图的布局
    • <b>StickyLayout</b>:悬浮布局

    整体架构

    页面动态化 整体架构如下:


    Screenshot 2017-04-27 19.10.17.png

    每个UIViewController都是一个页面,页面是由一个个卡片组成的,卡片其实就是代表了一个布局样式,每个卡片是由一个个元素组成的,元素其实指的就是卡片布局样式下的各个banner,对应的JSON数据结构如下:

    {
        "cards": [
            {
                "layout": 1,
                "elements": [
                    {
                        
                    },
                    {
                        
                    },
                    ...
                ]
            },
            {
                "layout": 1,
                "elements": [
                    {
                        
                    },
                    {
                        
                    },
                    ...
                ]
            },
            ...
        ]
    }
    

    具体实现

    由于大部分页面内容都需要上下滑动显示更多内容的,所以页面动态化的实现是基于UICollectionView来做的,当然也可以使用UIScrollView来实现(淘宝天猫都是通过一个自定义具有回收复用机制的UIScrollView来展示动态化页面内容的),我的理解是既然UICollectionView可以通过自定义UICollectionViewLayout来展现自定义的cell,为什么不用还需要自己定义一个具有回收复用机制的UIScrollView去展现内容,UICollectionView自身就是带有回收复用机制的。我的具体实现,先看下整体的UML图:

    Screenshot 2017-04-27 23.10.15.png

    每个KBBaseCard代表了一个布局的卡片,对应UICollectionView里的一个sectionKBBaseCard里elements的每个KBBaseElement代表了一个banner,对应UICollectionView里的一个itemKBBaseElement里的KBElementStyle提供banner需要展现的样式。KBElementStyle里的type字段是用来定义banner的样式,比方说type=1代表这个banner就是一张图。实际展示图如下:

    Screenshot 2017-04-27 23.21.04.png

    UICollectionViewLayout的自定义

    UICollectionView提供的UICollectionViewFlowLayout并不能满足我的对样式展现的需求,所以这里我们必须自己写一套UICollectionViewLayout来提供对KBBaseElementstyle字段里的样式支持,核心方法如下,具体实现在本文中不做过多详解,大家可以自己查询一下相关的知识:

    - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        UICollectionViewLayoutAttributes *layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
        
        NSInteger sectionLayout = 1;    // CardFlowLayout is the default layout
        
        if (self.delegate && [self.delegate respondsToSelector:@selector(collectionView:layout:layoutForSection:)]) {
            sectionLayout = [self.delegate collectionView:self.collectionView layout:self layoutForSection:indexPath.section];
        }
        
        // CardFlowLayout 流式布局
        if (sectionLayout == 1) {
            [self handleLayoutAttributesForFlowLayout:layoutAttributes atIndexPath:indexPath];
        }
        // CardLinearLayout 线性布局
        if (sectionLayout == 2) {
            [self handleLayoutAttributesForLinearLayout:layoutAttributes atIndexPath:indexPath];
        }
        // CardOneAndNLayout 左边一张大图右边N张小图布局
        if (sectionLayout == 3) {
            [self handleLayoutAttributesForOneAndNLayout:layoutAttributes atIndexPath:indexPath];
        }
        // CardWaterfallLayout 瀑布流布局
        if (sectionLayout == 4) {
            [self handleLayoutAttributesForWaterfallLayout:layoutAttributes atIndexPath:indexPath];
        }
        
        return layoutAttributes;
    }
    

    JSON数据

    这里提供一个我自己创建的JSON mock数据,还有根据这个JSON数据最终展现出来的页面图

    • JSON
    {
        "cards": [
            {
                "layout": 1,
                "style": {
                    "backgroundColor": "#ffffff"
                },
                "elements": [
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/lqdbpar1xWZw5NuOB9ezf80UDm75Ei%2BZyMo%2BMgvE%2Bdunea_02T1704271119_480_240.jpg",
                        "style": {
                            "display": "inline",
                            "margin": [
                                "0",
                                "0",
                                "0.75",
                                "0.75"
                            ],
                            "width_ratio": 0.5,
                            "width_height_ratio": 2.0
                        }
                    },
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/i11BQFE2dWpzplHNBV1Tr8Hafa5zTz%2BCoxF%2BwIBS%2BKF2Vx_03T1704261946_480_240.jpg",
                        "style": {
                            "display": "inline",
                            "margin": [
                                "0",
                                "0.75",
                                "0.75",
                                "0"
                            ],
                            "width_ratio": 0.5,
                            "width_height_ratio": 2.0
                        }
                    },
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/KwaBThC4mguSnQCGBXVtfK4RmTTSeQ%2BZ5Ql%2BTNvQ%2BKNWzP_05T1704251128_480_240.jpg",
                        "style": {
                            "display": "inline",
                            "margin": [
                                "0.75",
                                "0",
                                "0",
                                "0.75"
                            ],
                            "width_ratio": 0.5,
                            "width_height_ratio": 2.0
                        }
                    },
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/G4LGkdg7si4p5ZzVBZUKmkTq7EeTKt%2BRRaE%2BfQyx%2B6JlfC_06T1704251128_480_240.jpg",
                        "style": {
                            "display": "inline",
                            "margin": [
                                "0.75",
                                "0.75",
                                "0",
                                "0"
                            ],
                            "width_ratio": 0.5,
                            "width_height_ratio": 2.0
                        }
                    },
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/HNkdnuFcFey5Om5GpNpO-C2LLgTrO3WtFT1704201935_960_210.jpg",
                        "style": {
                            "display": "block",
                            "margin": [
                                "0.75",
                                "0",
                                "0",
                                "0"
                            ],
                            "width_height_ratio": 4.57
                        }
                    },
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/mrui23TlZJcRAocRWB70T1704262151_600_375.jpg",
                        "style": {
                            "display": "inline",
                            "margin": [
                                "0.75",
                                "0",
                                "0",
                                "0.75"
                            ],
                            "width_ratio": 0.7,
                            "width_height_ratio": 1.6
                        }
                    },
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/ppiV8ODszIZciIZbmQih-A6HUakFq6g6oLTNhT1704201914_474_555.jpg",
                        "style": {
                            "display": "inline",
                            "margin": [
                                "0.75",
                                "0.75",
                                "0",
                                "0"
                            ],
                            "width_ratio": 0.3,
                            "width_height_ratio": 0.685
                        }
                    }
                ]
            },
            {
                "layout": 3,
                    "style": {
                    "backgroundColor": "#ffffff"
                },
                "elements": [
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/KHASB80nO5JMsX1e2iChshdRT1704262150_480_480.jpg",
                        "style": {
                            "margin": [
                                "0",
                                "0",
                                "0",
                                "0.75"
                            ],
                            "width_ratio": 0.5,
                            "width_height_ratio": 1.0
                        }
                    },
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/ygMuXb96hrtGtT6Wc9vZ2T17040101959_480_240.jpg",
                        "style": {
                            "margin": [
                                "0",
                                "0.75",
                                "0.75",
                                "0"
                            ],
                            "width_ratio": 0.5,
                            "width_height_ratio": 2.0
                        }
                    },
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/ADB5IaeoJWP9pIzVmwzkfGKhT1704262151_480_240.jpg",
                        "style": {
                            "margin": [
                                "0.75",
                                "0.75",
                                "0",
                                "0"
                            ],
                            "width_ratio": 0.5,
                            "width_height_ratio": 2.0
                        }
                    }
                ]
            },
            {
                "layout": 1,
                "style": {
                    "backgroundColor": "#ffffff"
                },
                "elements": [
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/ppiV8ODszIZciIZbmQih-A6HUakFq6g6oLTNhT1704201914_474_555.jpg",
                        "style": {
                            "display": "inline",
                            "margin": [
                                "0",
                                "0",
                                "0",
                                "0.75"
                            ],
                            "width_ratio": 0.5,
                            "width_height_ratio": 0.856
                        }
                    },
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/mbO7ln3VxpAWxKkw84Ay-ys6BLHmk9LLRvwa4T1704201914_474_555.jpg",
                        "style": {
                            "display": "inline",
                            "margin": [
                                "0",
                                "0.75",
                                "0",
                                "0"
                            ],
                            "width_ratio": 0.5,
                            "width_height_ratio": 0.856
                        }
                    }
                ]
            },
            {
                "layout": 2,
                "style": {
                    "backgroundColor": "#ffffff"
                },
                "elements": [
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/hwCkTs9AoDThXhv5k38dr2M0T1704242204_960_480.jpg",
                        "style": {
                            "margin": [
                                "0",
                                "0",
                                "10",
                                "0"
                            ],
                            "width_height_ratio": 2.0
                        }
                    },
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/Tt9TfxyDTSSirP27lXEiIsKPriT1704241519_960_480.jpg",
                        "style": {
                            "margin": [
                                "0",
                                "0",
                                "10",
                                "0"
                            ],
                            "width_height_ratio": 2.0
                        }
                    },
                    {
                        "type": 1,
                        "image": "http://haitao.nos.netease.com/uey1sJ03lEOglRm626Th6dKrT1704242203_960_480.jpg",
                        "style": {
                            "margin": [
                                "0",
                                "0",
                                "10",
                                "0"
                            ],
                            "width_height_ratio": 2.0
                        }
                    }
                ]
            }
        ]
    }
    
    • 页面图
    Screenshot 2017-04-27 23.29.39.png Screenshot 2017-04-27 23.29.59.png

    转载请注明出处,原文地址:http://kobedai.me/p9rsts-6s/

    相关文章

      网友评论

      • 秦小二:楼主发我一份demo可好?谢谢🙏 1136454857@qq.com
      • 88c6d3fc8da7:大神求一份demo学习一下,谢谢啦!!!351409268@qq.com
      • 搬砖农民工:大神求一份demo学习一下,万分感谢!!!923674189@qq.com
      • 程序员不务正业:这玩意,不好玩。
      • wkywangking:哥们能否发一份demo给我, 学习一下, 先谢过了 wkywangking@163.com
      • 0c5901739ea4:求一份demo,万分感谢!!!1342948041@qq.com
      • Simple_Code:兄弟发我一份、学习一下、谢谢! 799680236@qq.com
      • AllureJM:楼主发我一份demo可好?谢谢🙏 1032472377@qq.com
      • flyfishcxy:楼主可否发我一份,谢谢!1603721009@qq.com
      • flyfishcxy:楼主可否发我一份,谢谢!1603721009@qq.com
      • PursueDream:麻烦发一份demo,谢谢!zhangzhongfeng_upc@163.com
      • 我亦非凡:楼主可否发我一份,谢谢,邮箱:929565498@qq.com
      • 晓风_d9ef:老哥写的太好了,忍不住给你打赏了,能给个Demo吗?万分感谢! 313999905@qq.com
      • 风车大战骑士:楼主,可以给一个demo,学习下思路吗?最近刚好再看这一块首页的布局。谢谢了229376483@qq.com
      • 风车大战骑士:大佬,能否给个demo研究学习下。huyong229@163.com 谢谢了
      • 打工仔阿云:909213456@qq.com 螺柱可否发我一份demo 学习呢 十分感谢
      • 猿姑凉:楼主能发我一份demo吗?谢谢! 1093874845@qq.com
      • PGOne爱吃饺子:你想累死后台啊
      • PGOne爱吃饺子:后台不会这么干的
      • 浅无痕smile:楼主跪求一份demo,879857712@qq.com,谢谢谢谢!
      • Ryan文濤:博主,可否发个demo看下?234515201@qq.com
      • 小梁同学:思路很棒,楼主能发份 Demo 看下吗??谢谢1129584401@qq.com
      • iDog:大哥 751706806@qq.com 麻烦发个demo 感谢
      • SunshineBrother:大神,求一个demo啊,2806139037@qq.com
      • nwwyt2:求Demo学习一下。nwwyt2@qq.com 谢谢
      • seasonZhu:帅哥,demo想学习一下可以发一下吗,zhujilong1987@163.com
      • fea808d77197:楼主, 可以给我也发一份demo吗, 跪谢~
        584106927@qq.com
      • 大兴安岭的风:考虑了一下,仅限于图片的展示类吧
      • xxyj:都是求代码的:joy:
      • 书写不简单:跪求作者发下demo,谢谢。1066283497@qq.com
      • 资料库:这种思路的方式是比较自由但是对后台那边要求比较高,后台比较费劲,相对来说的话还是定义好一个模板来弄的话好一些
      • 90後无所畏惧:楼主能发一份代码嘛,谢谢 ziliangcai@uniware.com.au
      • 猪队友小L:楼主可否发我一份,谢谢!568692092@qq.com

      • KFC是做基的:很棒,demo发我一下,谢谢
        1597043651@qq.com
      • c77f4a115d4f:楼主,可以发一份demo么,最新正好在研究类似的东西,863245483@qq.com 谢谢!
      • 莫太极:楼主大神求demo,2225219706@qq.com
      • 山顶破晓:楼主,求发一否代码,谢谢!1170148062@qq.com 谢谢!
      • 大兴安岭的风:写的太好了,可否发一份Demo。谢谢!
        fatin@qq.com
      • 9e39ec4000e9:求份demo,735481274@qq.com,多谢楼主~
      • snail_x:楼主,求份demo:grin: ,1056555797@qq.com,感谢!
      • SpecialHope:求参考一份 710403375@qq.com
      • yingxl1992:楼主可否发我一份,谢谢!345923947@qq.com
      • FlowYourHeart:这篇文章被cocoa China 推荐了 简书也是推荐的 上一周就收藏了 今天才看 求demo 1320664343@qq.com
      • 杭研融合通信iOS:科比球迷~ 你的这个方式据我所知很多厂子已经在用了
        Kobe_Dai:@杭研融合通信iOS 想法都大同小异,符合自己公司的需求就好
      • 玖琉:楼主仗义,827459435@qq.com
      • c33590a5dedf:我也想参考一下demo,让我也学习nices_wang@163.com
      • 3c96a3ea3cec:复用问题解决了吗?比较纠结复用。。。。😂
      • 暱稱已被使用:楼主 求发一份demo给我 598830828@qq.com!!
      • MR小锦:楼主,能否给我发一份demo,可以的话,请发到834015690@qq.com
      • 28bb64fffadd:看了下您的代码,是不是复用了,上下滑动几次后,布局就改变了
        b57da7c2e20c:哥们能给我发个 Demo 么 red676869@163.com 谢谢 万分感谢
        Kobe_Dai:@鲫鱼博博 demo复用有bug
      • 67403a05ac78:楼主给我也发送一份吧, 谢谢!!!!万分感谢 457636742@qq.com
      • 00fce043cf44:发我一份吧 十分感谢 sslxws@163.com
      • 904d78dee31f:楼主可否发我一份,谢谢!317177810@qq.com
      • __MAX:楼主,跪求demo 邮箱:759601179@qq.com
      • 清风自如:给个demo吧楼主 547477419@qq.com
      • 小伟Five:楼主可否发我一份,谢谢!1583327551@qq.com
      • 咖啡bu加糖:1042657187@qq.com
        谢谢
      • 1111e57bf6c6:楼主有劳发个demo,188580770@qq.com
      • a8064139c778:楼主可否发一份demo给我,谢谢!912418865@qq.com
      • 6bde012d309d:1033103039@qq.com 求dome 谢谢楼主:+1:
      • 一1二2三3:shizhiming@foxmail.com 求份demo学习 谢谢楼主
      • 空转风:529254622@qq.com 楼主好人一生平安
      • 打不死的小怪兽:楼主能否发一份demo。836407239@qq.com
      • 古月同学:楼主可否发我一份,谢谢!584535070@qq.com
      • L_Sovereign:可否发我一份,邮箱:787120559@qq.com
      • hopedark0921:麻烦给个demo研究下可以么 77046398@qq.com 谢谢了
      • Luck_Shadow:来份Demo学习下:918308266@qq.com
      • 7c4269f2876f:请楼主 发demo , dxm86050031@163.com
      • 三岁就很乖:Demo放出来吧。
      • 麟young:楼主将接口数据不仅仅表示数据,而是作为UI样式的想法很帅气,跪求Demo学习!851438717@qq.com
      • huiyuM:楼主可以把Demo放到 Github 上吗?这样大家就都方便了👍
      • 会跳舞的狮子:楼主大大发份demo参考下 929069909@qq.com
      • 深海的鲸_:谢谢楼主demo,1436692825@qq.com:smile:
      • 大刀阔斧007:求demo一份,1274381560@qq.com 谢谢
      • a93597be0215:求个demo学习下,937386518@qq.com
      • 童星:楼主给份 demo 研究下!TK。chaserl@126.com
      • f49607ee0f86:求楼主demo
      • 任尔东西南北疯:287028776@qq.com ,谢楼主,发我一份我研究下
      • 思考的快与慢:zwc_yichen@163.com 求发demo
      • 简检123:想研究一下,求demo,3294305397@qq.com。谢谢~
      • 独_fc98:楼主求demo一份,谢谢!457452152@qq.com
      • MarAlves:大神求个demo maralves@163.com ,谢谢
      • 8a5e6f1888bc:楼主求demo,awenpb@gmail.com
      • kelvin943:已关注,等待完善后的demo, 这个思路可以借鉴一下,在接口返回的数据里面去控制 APP 展示的样式,感觉会增加接口开发的难度,而且接口的文档比较难写,不容易维护
      • DarrenZhanghaha:楼主可否发我一份,谢谢!305178026@qq.com
      • 远方没有诗:楼主可否发我一份,感谢!312027082@qq.com
      • 七月不下雨:求demo,谢谢楼主,874607211@qq.com
      • 李潇南:2530569988@qq.com,谢谢楼主了!
      • 613638dccaa1:能发一份demo学习一下吗?谢谢啦。邮箱tj167@qq.com。感谢
      • zZ爱吃菜:1013269528@qq.com 学习下谢谢
      • SongLazy:期待楼主的demo观摩学习。452959610@qq.com。谢谢~
      • 会疼的白痴:很棒,demo发我一下,谢谢953995648@qq.com
      • 橘子的皮:楼主,可否发份demo,谢谢!!! 741136856@qq.com
      • 会疼的白痴:可否发我一份,辛苦了,谢了,953995648@qq.com
      • AceThink:楼主能否发一份demo,457982765@qq.com
      • a561547eee74:楼主能否发一份demo,547369346@qq.com
      • Eddiegooo:楼主 我想问下:你的那个json是怎么得到的? 后台直接给你返回约束吗?
        可否将demo发一下 nmgfqlong@126.com O(∩_∩)O谢谢
      • 逐日追星看月亮:楼主可否发我一份,谢谢!654238574@qq.com
      • 忘惘的小风扇:楼主,我📮 1160950249QQ.com ,学习一下:pray:
      • caecbec600aa:哈哈 楼主可以发一份给我吗?感觉你写的确实很不错 2568638177@qq.com

      本文标题:iOS页面动态化,怎么样用JSON数据的原生页面摆脱低效的H5页

      本文链接:https://www.haomeiwen.com/subject/jcsnzttx.html