RFQuiltLayout 和 UICollectionView
Posted
技术标签:
【中文标题】RFQuiltLayout 和 UICollectionView【英文标题】:RFQuiltLayout and UICollectionView 【发布时间】:2014-02-09 20:24:04 【问题描述】:我正在尝试将RFQuiltLayout
与我的UICollectionView
一起使用。
我的 CollectionView 可以在标准 UICollectionViewFlowLayout
下正常工作,但它只是一个网格。我希望我的照片布局很好,如图所示here.
我在理解将自定义布局与我的 UICollectionView 一起使用的要求时遇到了一些麻烦。
我正在以编程方式做所有事情。我没有使用任何 Interface Builder/NIB/Storyboards。
让 UICollectionView 使用标准 FlowLayout 进行布局很容易,但是当我尝试更改为 RFQuiltLayout 时,我遇到了以下错误:
'UICollectionView must be initialized with a non-nil layout parameter'
这似乎是一个常见错误,但其他问题的建议/答案都没有帮助我解决它。
所以这是我的代码的相关部分:
.h
@interface PFRootViewController : UIViewController <OFFlickrAPIRequestDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
@property (strong, nonatomic) UICollectionView *collectionView;
.m
//UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
//Used to use the above standard FlowLayout, but now trying to move to the below RFQuiltLayout
RFQuiltLayout* layout = (id)[self.collectionView collectionViewLayout];
layout.direction = UICollectionViewScrollDirectionVertical;
layout.blockPixels = CGSizeMake(100, 40);
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height) collectionViewLayout:layout];
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
[self.collectionView registerClass:[PFUICollectionViewCell class] forCellWithReuseIdentifier:@"FlickrCell"];
//Only Layout delegate method i've implemented:
- (CGSize) blockSizeForItemAtIndexPath:(NSIndexPath *)indexPath
if (indexPath.row % 2 == 0)
return CGSizeMake(80, 40);
return CGSizeMake(40, 80);
我真的不知道我还需要做什么才能让它正常工作。如果我只是删除 RFQuiltLayout 引用并取消注释我的 UICollectionViewFlowLayout alloc init 一切正常,尽管使用标准 FlowLayout。
因此,如果有人可以帮助我指出正确的方向,那就太好了,这应该很简单,但尝试开始工作真的很痛苦。 - UICollectionViews 不像 UITableViews 那样简单。
昨天我花了很大一部分时间尝试让我的 UICollectionView 工作的各种自定义布局(包括 RFQuiltLayout)没有任何成功。
非常感谢任何帮助,
问候, 约翰
【问题讨论】:
【参考方案1】:RFQuiltLayout* layout = (id)[self.collectionView collectionViewLayout];
在这里,您在初始化集合视图之前的两行向集合视图询问布局对象。与您注释掉的行进行比较:
//UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
你需要创建一个新的布局对象:
RFQuiltLayout* layout = [[RFQuiltLayout alloc] init];
然后将其分配给您的当前视图。
查看存储库的自述文件,问题在于您正在从viewDidLoad
方法复制代码,该方法假定集合视图及其布局已从情节提要中初始化。如果您在代码中创建视图,则还需要创建布局。
【讨论】:
嗯,这样写很容易... :) 让我试试这个解决方案,如果可行,我会标记为正确,谢谢。 谢谢!看起来我已经完成了一半,我只是按照建议进行分配和初始化,我不再有 nil 布局错误,但是当我加载应用程序时我的屏幕仍然是黑色的,如果我注释掉 RFQuilt 行并使用我看到瓷砖的标准流程布局,有什么想法吗? - 一旦得到 SO 的允许,PS 将立即奖励赏金。 事实上,当我使用标准流布局成功启动后,当我动态设置collectionView的布局时,collectionView只是空白,并且没有调用cellForItemAtIndexPath,不知道为什么! 看来您还需要将自己设置为布局的代表。 我才发现,伙计,我真笨!感谢您的帮助,赏金将很快奖励。我真的不喜欢 IB 和故事板,这让示例代码很难理解!以上是关于RFQuiltLayout 和 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章
flowLayout.itemSize 和 flowLayout.minimumInteritemSpacing
将布局更改为自定义类后,UicollectionViewCell 未显示
大小类和 UITableViewCell/UICollectionViewCell 大小
具有角半径和阴影的 SWIFT UITableViewCell
`dropSessionDidUpdate` 中的 UICollectionViewDropDelegate 错误的目标索引路径