我有一个UICollectionView,我已经设置好了,一切都很好(选择、标题等),但在某些情况下,我想更改滚动方向。
简而言之,如果我进入故事板并更改滚动方向,效果很好,但我想用程序来做!
我试着用之类的东西直接改变收藏视图的滚动方向
[myCollectionView setScrollDirection:....and so on.......
但这不起作用,我在那里找不到滚动方向或类似的东西。
我也尝试过设置流布局,但我确信我做得不对(即尝试将ViewLayout设置为FlowLayout)。
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
[myCollectionView setCollectionViewLayout:flowLayout];
这会导致很多约束问题,我怀疑我需要对flowLayout做更多的工作(从我现在发现的情况来看,它有点超出我的能力)。
还应该注意的是,我使用的是自定义单元格、页眉和页脚。
简而言之,有没有一种简单的方法可以做到这一点?或者有人知道一个好的Flow Layout教程吗?
编辑
我这样设置集合视图;
[myCollectionView setDataSource:self];
[myCollectionView setDelegate:self];
我实施了这些委托方法,所有的都很好
viewForSupplementaryElementOfKind
numberOfSectionsInCollectionView
numberOfItemsInSection
cellForItemAtIndexPath
didSelectItemAtIndexPath
我已经向.h添加了DataSource和Delegate,还添加了FlowLayout委托,但我不确定后者应该有什么。
大多数视觉布局都是在故事板中完成的,还有一些东西,比如字体、大小和颜色,我都是用程序完成的。
另一个编辑
这是我尝试更改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_sthrow上中断以在调试器中捕获此错误。中列出的UIView上UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。
这样做:
- (IBAction)changeDirection:(UIButton *)sender
{
UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)[self.collectionView collectionViewLayout];
if(layout.scrollDirection == UICollectionViewScrollDirectionHorizontal)
{
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
}
else
{
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
}
}
它对我有用。
在swift中,您可以执行以下操作:
//From the collection view subclass
if let layout: UICollectionViewFlowLayout = self.collectionViewLayout as? UICollectionViewFlowLayout {
layout.scrollDirection = .Vertical
}
好的,试着在集合视图上调用invalidateLayout,如下所示:
[myCollectionView.collectionViewLayout invalidateLayout];
这将强制集合视图在此时更新其布局(请参阅此处的apple文档)。我不确定,但我想当你改变滚动方向时,这不会被调用。
看看这是否能让你接近!
您可以使用集合视图出口的属性观察器didSet{}
来执行此操作。
假设collectionView的出口是myCollectionView,那么在代码中,将didSet
属性观察器添加到出口并更改布局的方向。类似
@IBOutlet weak var myCollectionView:UICollectionView!{
didSet{
let layout = contentCollectionView.collectionViewLayout as!
UICollectionViewFlowLayout
layout.scrollDirection = .Vertical
}
}
通常情况下,collectionView会从对象库中放入情节提要,它会自动随FlowLayout一起出现。您可以更改此布局的流动方向,方法是告诉代码,当我获得集合视图时,我希望其布局的滚动方向为水平或垂直。