【问题标题】:How can I change the scroll direction in UICollectionView?如何更改 UICollectionView 中的滚动方向?
【发布时间】:2013-08-27 11:29:34
【问题描述】:

我在基于故事板的 iOS 应用中有一个 UICollectionView。 当设备处于纵向时,我希望它垂直滚动,而当它在 Landscaper 中时,我希望它水平滚动。

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

【问题讨论】:

    标签: ios objective-c scroll uicollectionview orientation


    【解决方案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】:

          在您的 故事板 中执行此操作。从身份检查器中选择 滚动方向并选择您的方向。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-02-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-20
            • 1970-01-01
            • 2019-02-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多