我该如何在UICollectionView中改变滚动方向?

48

我在我的基于iOS的故事板中有一个UICollectionView。 当设备处于纵向方向时,我希望它可以垂直滚动;当设备处于横向方向时,我希望它可以水平滚动。

在UICollectionView中,我看到了 scrollEnabled 成员,但我找不到设置滚动方向的方法。我错过了什么吗?

6个回答

69
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)所有东西都对齐了,滚动方向实际上按预期生效了。看起来,苹果可能打算在视图控制器中管理滚动方向,而不是在布局中。 - BTRUE

16

Swift 4 和 4.2

if let layout = collectionViewObj.collectionViewLayout as? UICollectionViewFlowLayout {
        layout.scrollDirection = .vertical  // .horizontal
    }

13

设置集合视图的 collectionViewLayout scrollDirection

文档在这里


5
仅适用于使用 UICollectionViewFlowLayout 的情况。 - Edward Dale
2
谢谢@Mundi,你怎么知道这些东西的?无论如何,这是一些代码,供我自己做笔记:if let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout { flowLayout.scrollDirection = .Horizontal } - Dan Rosenstark

9

你应该试试这个:

- (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;
  } 
}

在Swift中:

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
    }

}

6

向Mundi和Dan Rosenstark致敬,这是Swift 4.2版本的答案。

if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
    flowLayout.scrollDirection = .horizontal
}

4

在你的Storyboard中进行此操作。从身份检查器中选择并选择滚动方向,并选择您的方向。

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接