【问题标题】:Change scroll direction in UICollectionView在 UICollectionView 中更改滚动方向
【发布时间】:2014-02-01 11:09:17
【问题描述】:

我已经设置了一个 UICollectionView,一切正常(选择、标题等),但是,我想在某些情况下更改滚动方向。

简而言之,如果我进入故事板并更改滚动方向,它可以正常工作,但我想以编程方式进行!

我曾尝试使用类似的方式直接更改集合视图的滚动方向

    [myCollectionView setScrollDirection:....and so on.......

但这不起作用,我在那里找不到 scrollDirection 或类似的东西。

我也尝试设置流布局,但我确定我做错了(即尝试将 ViewLayout 设置为 FlowLayout)。

    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
    [myCollectionView setCollectionViewLayout:flowLayout];

这会因很多约束问题而崩溃,我怀疑我需要对 flowLayout 做更多的工作(据我发现它现在比我高一点)。

还应注意,我使用的是自定义单元格、页眉和页脚。

简而言之,有没有简单的方法可以做到这一点?或者有谁知道一个好的流布局教程?

编辑

我这样设置集合视图;

[myCollectionView setDataSource:self];
[myCollectionView setDelegate:self];

我实现了这些委托方法并且一切正常

viewForSupplementaryElementOfKind
numberOfSectionsInCollectionView
numberOfItemsInSection
cellForItemAtIndexPath
didSelectItemAtIndexPath

我已将 DataSource 和 Delegate 添加到 .h 以及 FlowLayout 委托,但我不确定我还应该为后者添加什么。

大部分视觉布局都是在 Story Board 中完成的,我以编程方式完成了一些事情,例如字体、大小和颜色。

另一个编辑

这是我尝试更改 FlowLayout 时的错误,当我尝试使布局无效时也会出现此错误。

无法同时满足约束。 以下列表中的至少一个约束可能是您不想要的。试试这个:(1)查看每个约束并尝试找出您不期望的; (2) 找到添加了一个或多个不需要的约束的代码并修复它。 (注意:如果您看到不理解的 NSAutoresizingMaskLayoutConstraints,请参阅 UIView 属性 translatesAutoresizingMaskIntoConstraints 的文档)

"<NSAutoresizingMaskLayoutConstraint:0x89967f0 h=--& v=--& V:[menuCell:0x8991700(50)]>",
"<NSLayoutConstraint:0x8991200 menuCell:0x8991700.bottom == UILabel:0x8992be0.bottom + 100>",
"<NSLayoutConstraint:0x898fd50 UILabel:0x8992be0.top == menuCell:0x8991700.top + 3>"

将尝试通过打破约束来恢复

中断 objc_exception_throw 以在调试器中捕获它。 中列出的 UIView 上的 UIConstraintBasedLayoutDebugging 类别中的方法也可能会有所帮助。

【问题讨论】:

  • 集合视图所在的视图是否符合 UICollectionViewFlowLayoutDelegate 协议?您确定您尝试绘制的内容量足够大以保证集合视图实际滚动吗?我们可以看到更多集合视图的设置吗?通过尝试在 Flow Layout 上设置滚动方向,您正朝着正确的方向前进,所以好的开始!
  • @MatthewHallatt 我添加了更多信息。这是一张大桌子,4 或 5 个部分可能有 50-60 个项目。集合视图是底部的一个长条,水平滚动,可以单击按钮,使集合扩展到几乎大部分屏幕(正在工作),但我希望滚动移动到垂直滚动。

标签: ios xcode cocoa-touch uicollectionview flowlayout


【解决方案1】:

这样做:

- (IBAction)changeDirection:(UIButton *)sender
{
     UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)[self.collectionView collectionViewLayout];
     if(layout.scrollDirection == UICollectionViewScrollDirectionHorizontal)
     {
        layout.scrollDirection = UICollectionViewScrollDirectionVertical;
     }
     else
     {
         layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
     }
}

它对我有用。

【讨论】:

  • 仍然对我不起作用。即使我在更改后调用 [layout invalidateLayout]
  • 很高兴能帮上忙 :)
【解决方案2】:

您可以快速执行以下操作:

//From the collection view subclass
    if let layout: UICollectionViewFlowLayout = self.collectionViewLayout as? UICollectionViewFlowLayout {
        layout.scrollDirection = .Vertical
    }

【讨论】:

    【解决方案3】:

    好的,尝试在您的集合视图上调用 invalidateLayout,如下所示:

    [myCollectionView.collectionViewLayout invalidateLayout];
    

    这会强制集合视图在该点更新其布局 (See apple documentation here)。我不确定,但我不认为当你改变滚动方向时会调用它。

    看看这是否能让你靠近!

    【讨论】:

    • 我试过了,但得到了相同的结果,为了清楚起见,我也将整个错误放在我的问题中。我很快就可以简单地添加两个集合视图并在需要时显示/隐藏它们,但这似乎是一种资源浪费。
    • 您是否在单元格中设置了自己的约束?如果是这样,以编程方式还是在界面构建器中?问题似乎是您可能试图保持标签高度相同,但与单元格的顶部和底部保持一定距离。如果您正在设置自己的约束,请尝试删除将标签固定到单元格底部的约束,或者可能是约束标签高度的约束。或者,也许我一直在用这整条评论叫错树!
    • 看起来这一切都是在界面生成器中完成的。那里没有设置约束,所以我假设它们是自动完成的。我尝试添加一些但相同的。
    • 您是否在您的单元格的“prepareForReuse”方法中做任何事情?如果没有,请尝试将标签的文本设置为 nil (@""),并将任何图像设置为 nil,以防万一!
    • 我尝试为 viewForSupplementaryElementOfKind 中的视图返回 nil,它绘制页眉和页脚,但效果相同。我做了一个副本并删除了整个页眉页脚的东西,因为(正如你所说)它看起来像那里的东西。
    【解决方案4】:

    您可以使用属性观察者didSet{} 和您的集合视图出口来完成此操作。

    假设collectionView的出口是myCollectionView,在代码中添加一个didSet属性观察者到出口并改变布局的方向。有点像-

    @IBOutlet weak var myCollectionView:UICollectionView!{
          didSet{
                let layout = contentCollectionView.collectionViewLayout as!
    UICollectionViewFlowLayout
                layout.scrollDirection = .Vertical
            }
    }
    

    通常,collectionView 会从对象库中拖放到 Storyboard 中,它会自动与 FlowLayout 一起提供。您可以通过告诉您的代码当我获得我的集合视图时,我希望其布局的滚动方向是水平或垂直来更改此布局的流向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多