作者:主宰魔尊_164 | 来源:互联网 | 2023-06-08 16:03
我需要创建一个视图层,该视图层由根据api响应布置的组件组成。
想象一下,我有一个类似于-
的JSON响应
{
"id":"1fbcf51b-1811-405d-ba92-de5110910f83","name":"Gaming day","contentTemplate":{
"id":"300c01c3-747e-4446-8193-c2d633bfa8da","name":"Social Announcement","defaultLayoutId":"article","layouts":[
{
"id":"article","body":[
{
"classType":"CONTAINER","category":"CONTAINER","type":"FULL_WIDTH","elements":[
{
"classType":"TEXT","category":"INPUT","type":"TITLE","fieldId":"title"
},{
"classType":"TEXT","type":"SUMMARY","fieldId":"subtitle"
},{
"classType":"IMAGE","type":"IMAGE","fieldId":"mainImage"
},"type":"RICH_TEXT","fieldId":"body"
}
]
},{
"classType":"CONTAINER","type":"TWO_COLUMN_GRID","elements":[
{
"classType":"IMAGE","fieldId":"image1"
},"fieldId":"body1"
},"fieldId":"body2"
},"fieldId":"image2"
}
]
},"elements":[
{
"classType":"MetaDATA","category":"MetaDATA","type":"RELATED_ARTICLES"
}
]
}
]
}
]
}
}
在这里您可以看到layouts
包含一个元素数组,所有元素都是相同的类型,有些元素具有更多的可选属性,有些元素还具有嵌套的元素。
它从本质上描述了组件及其呈现方式
- 全宽行,堆叠了4个元素
- 2列网格,其中元素堆叠在两列中
- 全宽行,包含单个元素
这看起来像这样-
这是一个示例,但是其他布局将遵循此JSON结构。
在非常高的层次上,我将每个组件构建为UIView
的子类,并允许它接受各种模型,以设置显示的每个元素的数据。它们都将符合LayoutComponent
协议,并设置一些标准值。在这一点上,这很简单。
然后我将使用工厂为给定类型“构建”组件。
因为所有内容都是UIView
的子类,所以我应该没事。
在这一点上我不确定的是如何处理相互之间的组件布局。每个组件的内部布局都很简单,因为我可以将元素固定在需要知道的位置,因为我知道每个组件中存在哪些元素。
由于布局是动态的,当涉及将这些元素的总和锚定到演示文稿UIView
的{{1}}时,我不知道如何分辨最后一个UIViewController
元素固定到底部,之前的元素固定到其底部等。
如果感觉我可能最终会收到大量FULL_WIDTH
语句和自动布局代码。
只要每个子元素具有固有的内容大小或堆栈方向的约束(水平堆栈的宽度和垂直堆栈的高度),UIStackView就会为您执行此操作。
整个东西应该是一个垂直的堆栈视图,每一行应该是一个水平的堆栈视图。如果您认为它会比屏幕大,则将其放在scrollview中,并将垂直堆栈锚定到contentLayoutGuide上,其宽度限制应等于scrollViews父级;然后它只会垂直滚动到太大而无法显示。
Apple的Stackview指南:https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/LayoutUsingStackViews.html
,
我建议您使用UICollectionView来完成此任务。
此类实现单元的重用,并且在显示列表时不会消耗大量内存
您需要一个单元,例如ImageCell,TextCell和其他元素。此单元格应为指定大小的绘图内容(使用sizeThatFits和layoutSubviews或自动布局)
要实现一些布局规则,您有两种可能的方法:
1)创建自定义UICollectionViewLayout doc from Apple
2)另一种方法是创建布局单元格,例如TwoColumnCell,FullWidthCell。并添加像子视图这样的元素单元来布局单元。
第二种方法打破了单元的重用,因为您不能将单元重用于具体的元素类型。
而且您可以基于UIView而不是UICollectionView来实现这种方式。想法是用于布局的单元格类别很少,而用于绘制内容的单元格类别很少