RFQuiltLayout和UICollectionView

Woo*_*ock 1 objective-c uikit ios uicollectionview uicollectionviewlayout

我正试图RFQuiltLayout用我的UICollectionView.

我让CollectionView与标准配合工作正常,UICollectionViewFlowLayout但它只是一个网格.我希望我的照片布局很好,如图所示.

我在理解使用UICollectionView自定义布局所需的内容时遇到了一些麻烦.

我正在以编程方式做所有事情.我没有使用任何Interface Builder/NIB/Storyboard.

使用标准FlowLayout获取UICollectionView布局很容易,但是当我尝试更改为RFQuiltLayout时,我遇到了以下错误:

'UICollectionView must be initialized with a non-nil layout parameter'
Run Code Online (Sandbox Code Playgroud)

这似乎是一个常见的错误,但其他问题的建议/答案都没有帮助我解决它.

所以这是我的代码的相关部分:

.H

@interface PFRootViewController : UIViewController <OFFlickrAPIRequestDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
@property (strong, nonatomic) UICollectionView *collectionView;
Run Code Online (Sandbox Code Playgroud)

.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);
}
Run Code Online (Sandbox Code Playgroud)

我真的不知道还有什么我必须做的才能让这个工作.如果我只是删除RFQuiltLayout引用并取消注释我的UICollectionViewFlowLayout alloc init一切正常,尽管使用标准的FlowLayout.

因此,如果有人可以帮助我指出一个很好的方向,那应该很简单,但尝试并开始工作真的很痛苦. - UICollectionViews不像UITableViews那么简单.

昨天我花了大部分时间试图为我的UICollectionView工作(包括RFQuiltLayout)获得各种自定义布局,但没有任何成功.

任何帮助是极大的赞赏,

问候,约翰

jrt*_*ton 6

RFQuiltLayout* layout = (id)[self.collectionView collectionViewLayout];

在这里,您要在初始化集合视图之前询问布局对象的集合视图,两行.与您注释掉的行比较:

//UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];

您需要创建一个新的布局对象:

RFQuiltLayout* layout = [[RFQuiltLayout alloc] init];

然后将其分配给您的视图.

查看存储库的README,问题是您正在从viewDidLoad方法复制代码,该方法假定集合视图及其布局已从故事板初始化.如果您在代码中创建视图,则还需要创建布局.

  • 看起来您还需要将自己设置为布局的委托. (2认同)