Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios RFQuiltLayout和UICollectionView_Ios_Objective C_Uikit_Uicollectionview_Uicollectionviewlayout - Fatal编程技术网

Ios RFQuiltLayout和UICollectionView

Ios RFQuiltLayout和UICollectionView,ios,objective-c,uikit,uicollectionview,uicollectionviewlayout,Ios,Objective C,Uikit,Uicollectionview,Uicollectionviewlayout,我正在尝试将RFQuiltLayout与我的UICollectionView一起使用 我的CollectionView与标准的UICollectionViewFlowLayout配合得很好,但它只是一个网格。我希望我的照片布局如图所示 我很难理解在UICollectionView中使用自定义布局需要什么 我在按程序做每件事。我没有使用任何界面生成器/NIB/故事板 使用标准FlowLayout将UICollectionView设置为布局很容易,但当我尝试更改为RFQuiltLayout时,遇到以

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

我的CollectionView与标准的
UICollectionViewFlowLayout
配合得很好,但它只是一个网格。我希望我的照片布局如图所示

我很难理解在UICollectionView中使用自定义布局需要什么

我在按程序做每件事。我没有使用任何界面生成器/NIB/故事板

使用标准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;
我真的不知道我还需要做些什么才能让它工作。如果我只是删除RFQuiltLayout引用并取消对UICollectionViewFlowLayout alloc init的注释,那么一切都可以工作,尽管使用的是标准的FlowLayout

因此,如果有人能帮我指出正确的方向,那将是很好的,这应该很简单,但尝试开始工作真的很痛苦。-UICollectionView不像UITableView那么简单

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

非常感谢您的帮助

问候,,
John

RFQuiltLayout*layout=(id)[self.collectionView collectionView布局]

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

//UICollectionViewFlowLayout*布局=[[UICollectionViewFlowLayout alloc]init]

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


RFQuiltLayout*布局=[[RFQuiltLayout alloc]init]

然后将其指定给当前视图


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

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

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

//UICollectionViewFlowLayout*布局=[[UICollectionViewFlowLayout alloc]init]

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


RFQuiltLayout*布局=[[RFQuiltLayout alloc]init]

然后将其指定给当前视图


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

如果这样放置,很容易…:)让我试试这个解决方案,如果有效,我会标记为正确,谢谢。谢谢!看起来我已经完成了一半,我只是按照建议进行了alloc和init,并且我不再有nil布局错误,但是当我加载应用程序时,我的屏幕仍然是黑色的,如果我注释掉rfcoet行并使用我看到的平铺的标准流布局,有什么想法吗?-PS会在SO允许的情况下立即奖励我。事实上,当我成功使用标准流布局启动后动态设置collectionView的布局时,collectionView将变为空白,并且不会调用cellForItemAtIndexPath,不知道为什么!看起来你也需要把自己设定为布局的代表。我刚发现,伙计,我真是太蠢了!谢谢你的帮助,赏金马上就要颁发了。我真的不喜欢IB和故事板,它让示例代码很难理解!好吧,你这样说很容易…:)让我试试这个解决方案,如果有效,我会标记为正确,谢谢。谢谢!看起来我已经完成了一半,我只是按照建议进行了alloc和init,并且我不再有nil布局错误,但是当我加载应用程序时,我的屏幕仍然是黑色的,如果我注释掉rfcoet行并使用我看到的平铺的标准流布局,有什么想法吗?-PS会在SO允许的情况下立即奖励我。事实上,当我成功使用标准流布局启动后动态设置collectionView的布局时,collectionView将变为空白,并且不会调用cellForItemAtIndexPath,不知道为什么!看起来你也需要把自己设定为布局的代表。我刚发现,伙计,我真是太蠢了!谢谢你的帮助,赏金马上就要颁发了。我真的不喜欢IB和故事板,它让示例代码很难理解!
//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);
}