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

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

内容简介:头条的案例算是一个经典的案例,私底下也称为文章中贴出的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)今日头条案例》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Machine Learning

Machine Learning

Kevin Murphy / The MIT Press / 2012-9-18 / USD 90.00

Today's Web-enabled deluge of electronic data calls for automated methods of data analysis. Machine learning provides these, developing methods that can automatically detect patterns in data and then ......一起来看看 《Machine Learning》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具