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

UICollectionView 只显示 2 组数据

`dropSessionDidUpdate` 中的 UICollectionViewDropDelegate 错误的目标索引路径