Ios 复杂的交叉布局体系结构和关注点分离

Ios 复杂的交叉布局体系结构和关注点分离,ios,swift,uicollectionview,autolayout,uikit,Ios,Swift,Uicollectionview,Autolayout,Uikit,我想实现一个交叉布局,就像Wallapop应用程序在其主提要上所做的那样。 如您所见,它由两组单元格组成,它们是您附近的项目。第一组水平滚动,第二组垂直滚动 我想到的第一个制作这种布局的UIKit组件是UICollectionView,每个滚动方向有一个部分。不幸的是,UICollectionView当前的实现非常有限,无论您声明了多少节,都只能在一个方向上滚动 所以我想尝试一下香草UIKit组件,这就是我得到的; 我的解决方案的问题是,以绿色突出显示的垂直UICollectionViewCon

我想实现一个交叉布局,就像Wallapop应用程序在其主提要上所做的那样。 如您所见,它由两组单元格组成,它们是您附近的项目。第一组水平滚动,第二组垂直滚动

我想到的第一个制作这种布局的UIKit组件是UICollectionView,每个滚动方向有一个部分。不幸的是,UICollectionView当前的实现非常有限,无论您声明了多少节,都只能在一个方向上滚动

所以我想尝试一下香草UIKit组件,这就是我得到的; 我的解决方案的问题是,以绿色突出显示的垂直UICollectionViewController会自行滚动,而不会将水平UICollectionViewController向上推

我还考虑过为垂直单元格使用单个UICollectionViewController,并根据水平单元格的需要设置带有水平UICollectionViewController的UIStackView,但这是一个混乱的解决方案,缩放效果不好,如果我选择这种方式,我甚至无法为垂直单元格部分设置标题

理想情况下,我希望每组可滚动单元格都是它自己的UIViewController,以便清晰地分离关注点和模块性


有没有更好的方法来实现我想要的香草UIKit组件布局?

您可以使用以下方法:

包含两个单元格的集合视图。第一个单元格用于特色项目,第二个单元格用于您附近的项目。第一个单元格将覆盖设计所需的全部宽度和高度

为了实现可伸缩性,请使用容器视图,其中嵌入了CollectionViewController,该控制器将负责显示特色项目。此嵌入式CollectionViewController将水平滚动

靠近您的项是初始集合视图控制器的直接单元格

因此,特色水平集合视图的实现仍保留在嵌入式CollectionViewController中,单元格的项保留在主CollectionViewController中,主CollectionViewController还包含嵌入特色项的容器视图中的松散连接

它也不会遇到垂直滚动待售商品或向上滚动特色商品的问题

这是一个描述这个想法的截图


最简单、最稳定的解决方案是使用以下视图层次结构:

使用一个UICollectionView1实例 水平滚动部分可以实现为屏幕宽度UICollectionViewCell,其中包含水平滚动UICollectionView 垂直滚动部分应该只是UICollectionView1的常规部分 赞成的意见 仅限UIKit 不需要什么特别的东西-只要到处都有UICollectionViewFlowLayout 对于水平滚动单元格和垂直滚动单元格,单元格是相同的 良好的可扩展性和关注点分离。水平和垂直部分的独立行为,每个部分可以有多个数据源。 欺骗 水平滚动的部分应该有固定的高度。否则,滚动行为将更难维护

图像上的箭头表示使用!
这种设计的独特缺点是它不是模块化的。主UICollectionView的数据源必须处理用于水平滚动的占位符容器单元格以及产品模型,从而不会在其自己的UIViewController上分离每个部分*,以实现更好的模块化*我指的是每一个产品组,即:特色产品,在上一个我的example@Tylerian每种设计都是一个权衡问题。“不过,我同意你的看法。@Tylerian,关于数据源处理的情况,我可以建议你观看关于AggregateDataSource方法的这节课。他们提供的例子与你需要的有点不同,但是你可以接受这个想法。