我使用了 UICollectionView
来实现垂直滚动。
Cell 的宽度大于屏幕宽度,因此我创建了一个基于 UICollectionViewFlow
布局的 customFlowLayout
,返回正确计算的内容大小。
然而,这并不起作用。当单元格宽度小于屏幕宽度时,它可以正常工作。这是否意味着在垂直滚动中我们不能拥有大于屏幕宽度的宽度?
对于水平滚动也是一样的情况,但此时 CollectionView
的高度受限于屏幕高度。
有没有办法使其正常工作?
我使用了 UICollectionView
来实现垂直滚动。
Cell 的宽度大于屏幕宽度,因此我创建了一个基于 UICollectionViewFlow
布局的 customFlowLayout
,返回正确计算的内容大小。
然而,这并不起作用。当单元格宽度小于屏幕宽度时,它可以正常工作。这是否意味着在垂直滚动中我们不能拥有大于屏幕宽度的宽度?
对于水平滚动也是一样的情况,但此时 CollectionView
的高度受限于屏幕高度。
有没有办法使其正常工作?
就像其他人已经说过的,UICollectionView
只能使用流式布局在一个方向上滚动。然而,你可以非常容易地实现这一点,而不需要创建自定义布局或使用第三方库。
当你在story board中布置视图时,可以将你的UICollectionView
嵌入到一个UIScrollView
中。将滚动视图设置为水平滚动,而UICollectionView
则垂直滚动。然后将UICollectionView.delaysContentTouches
设置为true,这样触摸事件将通过到达UIScrollView
,而不会认为你要滚动collectionview。
在设置UICollectionView
时,将其大小和单元格的大小设置为实际想要的尺寸(比实际屏幕宽),并相应地布置它们。
现在,在包含的UIViewController
中,在视图生命周期内加入以下代码:
- (void)viewDidLayoutSubviews {
self.myScrollView.contentSize = self.myCollectionView.frame.size;
}
这就是你要做的全部,以实现你所描述的功能。现在你的滚动视图应该允许你水平滚动以查看整个单元格,而你的集合视图应该垂直滚动浏览所有单元格。
祝你编程愉快。
在进行此操作之前,您必须使用不同类型的布局。流式布局将其项目表示为列表,并根据可用宽度在单元格中跨越这些项目。 如果您想同时拥有水平和垂直滚动,您需要以某种方式指定网格的列数。FlowLayout没有这个功能。一个简单的解决方案是创建UICollectionViewLayout的子类,并覆盖collectionViewContentSize以使其返回一个宽度=一行单元格宽度的总和(这就是需要知道要多少列的地方),加上它们之间的任何额外间距。如果您的单元格每列具有相同的大小,类似于网格,则此方法将有效。
我不确定我是否理解了你的问题。
但是,如果您已经制作了自定义布局,请确保已经实现了:
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath;
同时确保您的布局属性框架和大小已经为“大型单元格”索引路径设置了正确的值。
另外,请确保您已经实现了:
- (CGSize) collectionViewContentSize;
该方法返回集合视图的contentSize。如果contentSize.width > 你的AppFrame.width,则应该进行水平滚动。高度也是一样,适用于垂直滚动。
还要确保你的collectionView允许滚动,并且使用以下方式正确准备你的布局:
- (void)prepareLayout
UICollectionViewLayout
还是 UICollectionViewFlowLayout
?