我正在尝试将RFQuiltLayout与我的UICollectionView一起使用。

我让CollectionView与标准UICollectionViewFlowLayout一起正常工作,但这只是一个网格。我希望我的照片布局精美,如图here.所示

我在理解将UILayoutView与自定义布局一起使用需要什么时遇到了麻烦。

我正在以编程方式进行所有操作。我没有使用任何Interface Builder / NIB / Storyboards。

使用标准FlowLayout使UICollectionView进行布局很容易,但是当我尝试更改为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分配初始化的注释,那么即使使用标准FlowLayout,也可以正常工作。

因此,如果有人可以帮助我指出正确的方向,那将是很简单的,但这应该很简单,但是尝试上班确实很痛苦。 -UICollectionViews不像UITableViews那样简单。

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

任何帮助是极大的赞赏,

问候,
约翰

最佳答案

RFQuiltLayout* layout = (id)[self.collectionView collectionViewLayout];
在这里,您向集合视图询问布局对象,在初始化集合视图之前两行。与您注释掉的行进行比较:
//UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
您需要创建一个新的布局对象:
RFQuiltLayout* layout = [[RFQuiltLayout alloc] init];
然后将其分配给您的视图。

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

关于ios - RFQuiltLayout和UICollectionView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21664555/

10-08 20:38