内容简介:头条的案例算是一个经典的案例,私底下也称为文章中贴出的XML代码你可以直接从git下载并且运行查看效果,现在就拿今日头条来做下案例分析,如下面三张图所示:
头条的案例算是一个经典的案例,私底下也称为 Feeds
类应用,该类应用有一个特点,那就是一个页面会显示很多条 Feed
,不同的 Feed
对应不同的模板,也就是不同的 (UITableViewCell子类)
,并且每个模板的高度是不固定的,有些模板中的文字需要适当 换行显示
,有些模板中的图片需要按照 比例显示
,并且还要考虑不同设备的适配,甚至还要考虑在屏幕横竖屏切换的情况,以上种种加一起来,做这样的应用相当的复杂。事实上,还有一种情况更加的棘手,那就是不同的app版本可能支持的模板种类不一样,比如在新的版本中加入了新的模板,那么对于老版本就无法显示了,不过这个问题这里就不做深入介绍了,你可以参考 热更新
一章来获得灵感:laughing:。
文章中贴出的XML代码你可以直接从git下载并且运行查看效果, git下载地址
现在就拿今日头条来做下案例分析,如下面三张图所示:
图1 | 图2 | 图3 |
---|
上面一共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)今日头条案例》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。