iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例

栏目: IOS · 发布时间: 5年前

内容简介:头条的案例算是一个经典的案例,私底下也称为文章中贴出的XML代码你可以直接从git下载并且运行查看效果,现在就拿今日头条来做下案例分析,如下面三张图所示:

头条的案例算是一个经典的案例,私底下也称为 Feeds 类应用,该类应用有一个特点,那就是一个页面会显示很多条 Feed ,不同的 Feed 对应不同的模板,也就是不同的 (UITableViewCell子类) ,并且每个模板的高度是不固定的,有些模板中的文字需要适当 换行显示 ,有些模板中的图片需要按照 比例显示 ,并且还要考虑不同设备的适配,甚至还要考虑在屏幕横竖屏切换的情况,以上种种加一起来,做这样的应用相当的复杂。事实上,还有一种情况更加的棘手,那就是不同的app版本可能支持的模板种类不一样,比如在新的版本中加入了新的模板,那么对于老版本就无法显示了,不过这个问题这里就不做深入介绍了,你可以参考 热更新 一章来获得灵感:laughing:。

文章中贴出的XML代码你可以直接从git下载并且运行查看效果, git下载地址

iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例

现在就拿今日头条来做下案例分析,如下面三张图所示:

iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例
图1
iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例
图2
iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例
图3

上面一共7种不同的模板。下面一一进行分析。

整体分析

从上面7中不同的模板可以归类出有两种基础的布局模板。

  1. 模板1、2、3、4使用的模板归为一类,分为上下两层,上面一层是新闻内容,下面显示该条新闻出处、评论、时间内容,而只有第一层新闻内容那一层是会改变的。那么就可以定义一个基础模板。

    <!--基础模板1-->
    <template t-name="base1">
        <stack-panel>
            <!-- 占位模板,新闻内容 -->
            <template-slot slot-name="content" space-before="10" />
            <!--底部信息-->
            <stack-panel is-horizon="1" space="10" space-before="10" space-after="10">
                <lable text="人民网" font-color="999999" />
                <lable text="15评论" font-color="999999" />
                <lable text="1小时前" font-color="999999" />
            </stack-panel>
        </stack-panel>
    </template>
    复制代码

    注意到上面使用了 template-slot 用来占位,这样不同模板的新闻内容就可以通过 template-slot 来显示了。另外,将该占位名称设为 content ,对应 slot-name="content"

    事实上,一个模板中,你可以定义N个 template-slot ,只需要 slot-name 唯一即可。

  2. 模板5、6、7使用的模板归为第二类,该类模板分三层,上面一层是用户信息,第二层是新闻内容,第三层是赞、评论、分享数量等信息的显示。同样的只有中间第二层的新闻内容会改变的,第一层和第三层是不会改变的。

    <!--基础模板2 (带用户信息)-->
    <template t-name="base2">
        <stack-panel>
            <!-- 用户信息 -->
            <stack-panel is-horizon="1" space-before="10" space="10">
                <image size="32" corner-radius="16" url="http://imgtu.5011.net/uploads/content/20170504/5905661493879766.jpg" />
                <!-- 占用中间全部剩余空间 -->
                <stack-panel flex-grow="1" flex-shrink="1">
                    <lable text="海伟22" font-size="14" font-color="191919" />
                    <lable text="码农" font-color="999999" />
                </stack-panel>
                <!-- 右边的关注按钮 -->
                <dock-panel width="50">
                    <lable text="关注" font-color="red" font-size="14" />
                </dock-panel>
            </stack-panel>
            <!-- 占位模板,新闻内容 -->
            <template-slot slot-name="content" space-before="10" />
            <!--底部信息-->
            <grid-panel columns="3" space-before="10" space-after="10">
                <stack-panel is-horizon="1" justify-content="1" space="5" align-items="2">
                    <image local-name="zan" size="15" />
                    <lable text="21" font-color="191919" />
                </stack-panel>
                <stack-panel is-horizon="1" justify-content="1" space="5" align-items="2">
                    <image local-name="zan" size="15" />
                    <lable text="49" font-color="191919" />
                </stack-panel>
                <stack-panel is-horizon="1" justify-content="1" space="5" align-items="2">
                    <image local-name="zan" size="15" />
                    <lable text="60" font-color="191919" />
                </stack-panel>
            </grid-panel>
        </stack-panel>
    </template>
    复制代码

    同样的,上面的模板一样使用了 template-slot 用来占位。

模板分析

下面开始一一分析7个不同的模板,7种模板都是基于上面定义的两个基础模板进行开开发的,你可以理解为 类的继承 关系。

模板1

iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例

模板1的内容很简单,就是显示新闻标题。并且不限制行数。

<!--feed模板1文字模板-->
<template t-name="t1">
    <!-- 基于base1开发 -->
    <template-ref t-name="base1">
        <!-- 模板占位 slot-name="content"  -->
        <lable text="国际社会积极评价习近平主席在金砖国家工商论坛上的重要讲话" slot-name="content" font-color="191919" font-size="24" />
    </template-ref>
</template>
复制代码
  1. 该模板是基于 base1 模板进行开发的,这种方式叫做 模板嵌套 。类似于 类的继承
  2. 注意上面的 slot-name="content" ,将 base1 模板中的 template-slot 替换成 lable

模板2

iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例

模板2的内容为标题+图片,并且图片最多显示三张,并且图片按照宽高比16:9进行显示。

<!--feed模板2,文字加图片,图片16:9显示-->
<template t-name="t2">
    <!-- 基于base1开发 -->
    <template-ref t-name="base1">
        <!-- 占位内容 -->
        <stack-panel slot-name="content">
            <lable text="国际社会积极评价习近平主席在金砖国家工商论坛上的重要讲话" font-color="191919" font-size="24" />
            <!-- 使用grid-panel布局,每行三列,并且列间距10 -->
            <grid-panel columns="3" space-before="10" data-context="[1,2,3]" column-spacing="10">
                <for>
                    <!-- 宽高比例16:9 -->
                    <ratio-panel ratio="0.5625">
                        <image url="http://img5.duitang.com/uploads/item/201204/01/20120401222440_eEjyC.thumb.700_0.jpeg" />
                    </ratio-panel>
                </for>
            </grid-panel>
        </stack-panel>
    </template-ref>
</template>
复制代码

模板3

iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例

模板3的内容为左边是标题,右边是图片,并且图片的宽度占行宽的32%,并且图片的宽高比例16:9。

<!--feed模板3,文字加图片,图片16:9显示,宽度为50%cell宽度-->
<template t-name="t3">
    <!-- 基于base1开发 -->
    <template-ref t-name="base1">
        <!-- 占位内容 -->
        <stack-panel slot-name="content" is-horizon="1">
            <!-- 左边标题,使用flex-grow="1" flex-shrink="1"属性将左边的内容全部占用  -->
            <lable text="国际社会积极评价习近平主席在金砖国家工商论坛上的重要讲话" flex-grow="1" flex-shrink="1" font-color="191919" font-size="24" />
            <!-- 图片宽度为行宽的32%,并且宽高比为16:9,跟lable的间距为10 -->
            <ratio-panel width="32%" ratio="0.5625" space-before="10">
                <image url="http://img5.duitang.com/uploads/item/201204/01/20120401222440_eEjyC.thumb.700_0.jpeg" />
            </ratio-panel>
        </stack-panel>
    </template-ref>
</template>
复制代码

模板4

iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例

模板4的内容为上面是标题,下面是图片,图片宽高按照16:9显示。标题最多显示3行。

<!--feed模板4-->
<template t-name="t4">
    <!-- 基于base1开发 -->
    <template-ref t-name="base1">
        <!-- 占位内容 -->
        <stack-panel slot-name="content">
            <lable text="国际社会积极评价习近平主席在金砖国家工商论坛上的重要讲话" font-color="191919" font-size="24" lines="3" />
            <ratio-panel ratio="0.5625" space-before="10">
                <image url="http://img5.duitang.com/uploads/item/201204/01/20120401222440_eEjyC.thumb.700_0.jpeg" />
            </ratio-panel>
        </stack-panel>
    </template-ref>
</template>
复制代码

模板5

iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例

模板5的内容为上面是标题,下面是图片,宽度固定200。宽高比例为16:9

<!--feed模板5-->
<template t-name="t5">
    <!-- 基于base2开发 -->
    <template-ref t-name="base2">
        <!-- 占位内容 -->
        <stack-panel slot-name="content">
            <!-- 标题,最多显示3行 -->
            <lable text="国际社会积极评价习近平主席在金砖国家工商论坛上的重要讲话" font-color="191919" font-size="24" lines="3" />
            <ratio-panel ratio="0.5625" space-before="10" width="200">
                <image url="http://img5.duitang.com/uploads/item/201204/01/20120401222440_eEjyC.thumb.700_0.jpeg" />
            </ratio-panel>
        </stack-panel>
    </template-ref>
</template>
复制代码

模板6

iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例

模板6的内容其实跟模板2的内容是一样的。只是使用的基础模板不同而已。

<!--feed模板6-->
<template t-name="t6">
    <!-- 基于base2开发 -->
    <template-ref t-name="base2">
        <!-- 占位内容 -->
        <stack-panel slot-name="content">
            <lable text="国际社会积极评价习近平主席在金砖国家工商论坛上的重要讲话" font-color="191919" font-size="24" lines="3" />
            <!-- 使用grid-panel布局,每行三列,并且列间距10 -->
            <grid-panel columns="3" column-spacing="10" space-before="10" data-context="[1,2,3]">
                <for>
                    <ratio-panel ratio="0.5625">
                        <image url="http://img5.duitang.com/uploads/item/201204/01/20120401222440_eEjyC.thumb.700_0.jpeg" />
                    </ratio-panel>
                </for>
            </grid-panel>
        </stack-panel>
    </template-ref>
</template>
复制代码

模板7

iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例

模板7的内容上面是标题,下面是新闻的引用。左边图片,右边是新闻的描述,新闻描述最多显示两行,并且垂直居中显示。

<!--feed模板7-->
<template t-name="t7">
    <!-- 基于base2开发 -->
    <template-ref t-name="base2">
        <!-- 占位内容 -->
        <stack-panel slot-name="content">
            <!-- 标题,最多显示三行 -->
            <lable text="国际社会积极评价习近平主席在金砖国家工商论坛上的重要讲话" font-color="191919" font-size="24" lines="3" />
            <!-- 新闻描述水平显示,并且垂直方向居中显示。 -->
            <stack-panel is-horizon="1" space-before="10" space="10" align-items="2" background-color="efefef">
                <!-- 图片宽度80,并且宽高4:3 -->
                <ratio-panel width="80" ratio="0.75">
                    <image url="http://img5.duitang.com/uploads/item/201204/01/20120401222440_eEjyC.thumb.700_0.jpeg" />
                </ratio-panel>
                <!-- 最多显示两行,并且占用剩余的全部空间 -->
                <lable text="环球网:中国巴基斯坦加油!会哭会的哈哈但是上帝大大所大多撒多扫地哈哈是的哈哈" flex-grow="1" flex-shrink="1" font-size="14" lines="2" />
            </stack-panel>
        </stack-panel>
    </template-ref>
</template>
复制代码

显示模板

上面的模板介绍完了,那么下面就需要将模板显示出来了。因为不同的feed数据需要不同的模板来显示,那么就必须使用 数据绑定 来实现了。

<!-- UITableView -->
<list>
    <section>
        <for data-path="items">
            <!-- UITableViewCell -->
            <list-item>
                <!-- 新闻内容的内边距为左右间距12,上下间距0 -->
                <inset-panel inset="0 12">
                    <!-- 通过数据绑定选择模板 -->
                    <template-ref t-name="{{}}"></template-ref>
                </inset-panel>
            </list-item>
        </for>
    </section>
</list>
复制代码

demo用的数据内容。

class Index {
    constructor() {
        this.items = [
            "t1", "t2", "t3", "t4", "t5", "t6", "t7",
            "t1", "t2", "t3", "t4", "t5", "t6", "t7",
            "t1", "t2", "t3", "t4", "t5", "t6", "t7"];
    }
}
复制代码

这样就能一次性显示出21条数据。包含三种模板,数组中的字符串表示的就是模板名称。

上面所有的模板代码包括 注释 也就180行代码,如果使用传统方式开发的话,你自己可以评估下开发工作量。


以上所述就是小编给大家介绍的《iOS混合开发库(GICXMLLayout)布局案例分析(1)今日头条案例》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

老码识途

老码识途

韩宏 / 电子工业出版社 / 2012-8 / 56.00元

《老"码"识途:从机器码到框架的系统观逆向修炼之路》以逆向反汇编为线索,自底向上,从探索者的角度,原生态地刻画了对系统机制的学习,以及相关问题的猜测、追踪和解决过程,展现了系统级思维方式的淬炼方法。该思维方式是架构师应具备的一种重要素质。《老"码"识途:从机器码到框架的系统观逆向修炼之路》内容涉及反汇编、底层调试、链接、加载、钩子、异常处理、测试驱动开发、对象模型和机制、线程类封装、跨平台技术、插......一起来看看 《老码识途》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具