如何更改 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)horizo​​ntalSizeClass 还没有改变,滚动方向设置不正确 2)scrollingDirection 设置正确,但为时已晚,没有生效,3)一切都正确排列,滚动方向实际按需要生效。似乎 Apple 打算在视图控制器而不是布局中管理滚动方向。【参考方案2】:

设置集合视图的collectionViewLayoutscrollDirection

文档是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 单元格大小?

如何更改 UICollectionView 插座的高度?

单击 UIButton 时切换/更改 UICollectionView 中的单元格

更改数据源时 UICollectionView 中的平滑动画