如何更改 UICollectionView 中的滚动方向?
Posted
技术标签:
【中文标题】如何更改 UICollectionView 中的滚动方向?【英文标题】:How can I change the scroll direction in UICollectionView? 【发布时间】:2013-08-27 11:29:34 【问题描述】:我在基于故事板的 iOS 应用中有一个 UICollectionView。 当设备处于纵向时,我希望它垂直滚动,而当它在 Landscaper 中时,我希望它水平滚动。
在 UICollectionView 我可以看到 scrollEnabled 成员,但我看不到设置滚动方向的方法。我错过了什么吗?
【问题讨论】:
【参考方案1】:UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
还要注意,在您的流程布局中以 prepareForLayout
调用它似乎没问题...
@interface LayoutHorizontalThings : UICollectionViewFlowLayout
@end
@implementation LayoutHorizontalBooks
-(void)prepareLayout
[super prepareLayout];
self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
self.minimumInteritemSpacing = 0;
self.minimumLineSpacing = 0;
self.itemSize = CGSizeMake(110,130);
self.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
【讨论】:
我看到了这个问题,其中 prepareLayout 间歇性地调用不够早或调用太晚。结果是三件事之一:1)horizontalSizeClass 还没有改变,滚动方向设置不正确 2)scrollingDirection 设置正确,但为时已晚,没有生效,3)一切都正确排列,滚动方向实际按需要生效。似乎 Apple 打算在视图控制器而不是布局中管理滚动方向。【参考方案2】:设置集合视图的collectionViewLayout
的scrollDirection
。
文档是here。
【讨论】:
这仅适用于您使用UICollectionViewFlowLayout
。
谢谢@Mundi,你是怎么知道这些东西的?无论如何,一些代码为我自己的笔记:if let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout flowLayout.scrollDirection = .Horizontal
【参考方案3】:
Swift 4 和 4.2
if let layout = collectionViewObj.collectionViewLayout as? UICollectionViewFlowLayout
layout.scrollDirection = .vertical // .horizontal
【讨论】:
【参考方案4】:你应该试试这个:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)[self.collectionView collectionViewLayout];
if ((toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) || (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft))
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
else
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
在斯威夫特中:
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval)
var layout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
if ((toInterfaceOrientation == UIInterfaceOrientation.LandscapeLeft) || (toInterfaceOrientation == UIInterfaceOrientation.LandscapeRight))
layout.scrollDirection = UICollectionViewScrollDirection.Vertical
else
layout.scrollDirection = UICollectionViewScrollDirection.Horizontal
【讨论】:
【参考方案5】:感谢 Mundi 和 Dan Rosenstark 的回答,这里是 swift 4.2 版本。
if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout
flowLayout.scrollDirection = .horizontal
【讨论】:
【参考方案6】:在您的 故事板 中执行此操作。从身份检查器中选择 滚动方向并选择您的方向。
【讨论】:
以上是关于如何更改 UICollectionView 中的滚动方向?的主要内容,如果未能解决你的问题,请参考以下文章
如何仅重新加载 UICollectionView 的可见部分?
Swift - UICollectionView:如何在标题中自动布局标签间距
设备方向更改时如何更改 UiCollectionView 单元格大小?