Indexpath长度为3的自定义集合视图布局

时间:2014-05-06 11:17:20

标签: ios objective-c uikit uicollectionview nsindexpath

我正在尝试创建自定义布局,并且每个LayoutAttributes的索引路径都需要包含一些其他信息,如section,row,column。为了合并它,我创建了NSIndexpath类别,返回长度为3的NSIndexpath。 Bellow是类别的代码片段

  

+(NSIndexPath *)indexPathForColumn:(NSUInteger)列forRow:(NSUInteger)row forSection:(NSUInteger)section {

NSUInteger indexPaths[] = {section, row, column};
NSIndexPath *returnIndexPath = [[NSIndexPath  alloc] initWithIndexes: indexPaths length:3];

return returnIndex;   }

我想,我将获得相同的索引路径表单集合视图数据源方法但是" collectionView cellForItemAtIndexPath:"方法总是返回长度为2的索引路径。

我不明白为什么会这样。任何人都可以向我解释一下这背后的逻辑以及可以实现预期行为的选择是什么?

2 个答案:

答案 0 :(得分:0)

答案很简单,但对你来说却不尽如人意。 它不可能那样做。

indexPath由collectionView创建,而不是由您自己创建。由于collectionView没有属性列,因此您无法使用它。

但是,您可以根据布局计算列值。您知道元素的大小,并得到截面和行,因此您可以计算列。

希望有所帮助。

干杯, 塞巴斯蒂安

答案 1 :(得分:0)

我能够通过稍微不同地使用索引来实现这一点:

@interface NSIndexPath (SGBGridLayout)

+ (NSIndexPath *)indexPathForGridSection:(NSInteger)gridSection gridRow:(NSInteger)gridRow gridColumn:(NSInteger)gridColumn numberOfColumns:(NSUInteger)numberOfColumns;

@property (nonatomic, assign, readonly) NSInteger gridSection;
@property (nonatomic, assign, readonly) NSInteger gridRow;
@property (nonatomic, assign, readonly) NSInteger gridColumn;
@property (nonatomic, assign, readonly) NSInteger itemNumber;
@property (nonatomic, assign, readonly) NSInteger numberOfColumns;

@end

@implementation NSIndexPath (SGBGridLayout)

+ (NSIndexPath *)indexPathForGridSection:(NSInteger)gridSection gridRow:(NSInteger)gridRow gridColumn:(NSInteger)gridColumn numberOfColumns:(NSUInteger)numberOfColumns
{
    NSUInteger itemNumber = (gridRow * numberOfColumns) + gridColumn;
    NSUInteger indexes[] = { gridSection, itemNumber, numberOfColumns };
    return [self indexPathWithIndexes:indexes length:3];
}

- (NSInteger)gridSection
{
    return [self indexAtPosition:0];
}

- (NSInteger)itemNumber
{
    return [self indexAtPosition:1];
}

- (NSInteger)numberOfColumns
{
    return [self indexAtPosition:2];
}

- (NSInteger)gridRow
{
    return self.itemNumber / self.numberOfColumns;
}

- (NSInteger)gridColumn
{
    return self.itemNumber % self.numberOfColumns;
}

@end

集合视图仅使用前两个索引,因此只要我们确保前两个索引始终是唯一的,我们仍然可以使用第三个索引来编码我们需要的信息。在这种情况下,我需要一个部分/行,所以我使用第二个来存储(row * numberOfColumns)+列,第三个存储numberOfColumns;这样,当集合视图返回给我的索引路径时,我可以将行和列退出。