内容简介:头条的案例算是一个经典的案例,私底下也称为文章中贴出的XML代码你可以直接从git下载并且运行查看效果,现在就拿今日头条来做下案例分析,如下面三张图所示:
头条的案例算是一个经典的案例,私底下也称为 Feeds 类应用,该类应用有一个特点,那就是一个页面会显示很多条 Feed ,不同的 Feed 对应不同的模板,也就是不同的 (UITableViewCell子类) ,并且每个模板的高度是不固定的,有些模板中的文字需要适当 换行显示 ,有些模板中的图片需要按照 比例显示 ,并且还要考虑不同设备的适配,甚至还要考虑在屏幕横竖屏切换的情况,以上种种加一起来,做这样的应用相当的复杂。事实上,还有一种情况更加的棘手,那就是不同的app版本可能支持的模板种类不一样,比如在新的版本中加入了新的模板,那么对于老版本就无法显示了,不过这个问题这里就不做深入介绍了,你可以参考 热更新 一章来获得灵感:laughing:。
文章中贴出的XML代码你可以直接从git下载并且运行查看效果, git下载地址
现在就拿今日头条来做下案例分析,如下面三张图所示:
|
|
|
|
|---|
上面一共7种不同的模板。下面一一进行分析。
整体分析
从上面7中不同的模板可以归类出有两种基础的布局模板。
-
模板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唯一即可。 -
模板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
模板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>
复制代码
- 该模板是基于
base1模板进行开发的,这种方式叫做模板嵌套。类似于类的继承。 - 注意上面的
slot-name="content",将base1模板中的template-slot替换成lable。
模板2
模板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
模板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
模板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
模板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
模板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
模板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)今日头条案例》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法笔记上机训练实战指南
胡凡、曾磊 / 机械工业出版社 / 2016-7 / 57
《算法笔记上机训练实战指南》是《算法笔记》的配套习题集,内容按照《算法笔记》的章节顺序进行编排,其中整理归类了PAT甲级、乙级共150多道题的详细题解,大部分题解均编有题意、样例解释、思路、注意点、参考代码,且代码中包含了详细的注释。读者可以通过本书对《算法笔记》的知识点进行更深入的学习和理解。书中印有大量二维码,用以实时更新或补充书籍的内容及发布本书的勘误。 《算法笔记上机训练实战指南》可......一起来看看 《算法笔记上机训练实战指南》 这本书的介绍吧!