我有类似的问题
like this
- @interface CollectionViewController ()
- {
- NSMutableArray *arrMain;
- }
- @property(nonatomic,strong) NSMutableArray *arrMain;
- @end
- @implementation CollectionViewController
- @synthesize arrMain,- (void)viewDidLoad
- {
- [super viewDidLoad];
- [cView registerNib:[UINib nibWithNibName:@"CViewCell" bundle:nil] forCellWithReuseIdentifier:kCellID];
- CViewFlowLayout *fl = [[CViewFlowLayout alloc] init];
- self.cView.collectionViewLayout = fl;
- NSString *strJson = MY FUNCTION WHICH RETURNS JSON STRING;
- SBJSON *parser = [[SBJSON alloc] init];
- self.arrMain = [[NSMutableArray alloc] init];
- self.arrMain = [parser objectWithString:strJson error:nil];
- for (int i=0; i<[self.arrMain count]; i++) {
- NSDictionary *dic = [self.arrMain objectAtIndex:i];
- [self setTags:[[UIView alloc] init] selDictionary:dic]; // This function generates height and save it to the dictionary
- }
- [cView reloadData];
- }
- - (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section;
- {
- return [self.arrMain count];
- }
- - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
- {
- NSDictionary *dic = [self.arrMain objectAtIndex:indexPath.row];
- return CGSizeMake(236,40+[[dic valueForKey:@"TAGS_HEIGHT"] intValue]);
- }
- - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;
- {
- CViewCell *cell =(CViewCell *) [cv dequeueReusableCellWithReuseIdentifier:kCellID forIndexPath:indexPath];
- NSDictionary *dic = [self.arrMain objectAtIndex:indexPath.row];
- if ([cell viewWithTag:11]){
- [[cell viewWithTag:11] release];
- [[cell viewWithTag:11] removeFromSuperview];
- }
- UIView *viewTags = [[UIView alloc] init];
- [viewTags setTag:11];
- [viewTags setBackgroundColor:[UIColor lightGrayColor]];
- [self setTags:viewTags selDictionary:dic];
- [viewTags setFrame:CGRectMake(5,10,CONTENT_WIDTH,[[dic valueForKey:@"TAGS_HEIGHT"] floatValue])];
- [cell.contentView addSubview:viewTags];
- return cell;
- }
我试过上面的链接解决方案,但它不适用于我.
这是我的输出的图像.
我需要的间距是相同的.
有人有解决这个问题的人吗?
这是UICOllectionView的错误吗?因为我在this article也发现了这个问题.
解决方法
我有一个这样的问题的一般解决方案:
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- [cView registerNib:[UINib nibWithNibName:@"CViewCell" bundle:nil] forCellWithReuseIdentifier:kCellID];
- CViewFlowLayout *fl = [[CViewFlowLayout alloc] init];
- fl.minimumInteritemSpacing = 10;
- fl.scrollDirection = UICollectionViewScrollDirectionVertical;
- self.cView.collectionViewLayout = fl;
- NSString *strJson = MY FUNCTION WHICH RETURNS JSON STRING;
- SBJSON *parser = [[SBJSON alloc] init];
- self.arrMain = [[NSMutableArray alloc] init];
- self.arrMain = [parser objectWithString:strJson error:nil];
- for (int i=0; i<[self.arrMain count]; i++) {
- NSDictionary *dic = [self.arrMain objectAtIndex:i];
- [self setTags:[[UIView alloc] init] selDictionary:dic]; // This function generates height and save it to the dictionary
- }
- [cView reloadData];
}
然后,更新CViewFlowLayout.m中的代码,它是UICollectionViewFlowLayout的一个子类.
这是代码:
- #define numColumns 3
- @implementation CViewFlowLayout
- @synthesize numOfColumnsToDisplay;
- - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
- {
- NSArray* attributesToReturn = [super layoutAttributesForElementsInRect:rect];
- for (UICollectionViewLayoutAttributes* attributes in attributesToReturn)
- {
- if (nil == attributes.representedElementKind)
- {
- NSIndexPath* indexPath = attributes.indexPath;
- attributes.frame = [self layoutAttributesForItemAtIndexPath:indexPath].frame;
- }
- }
- return attributesToReturn;
- }
- - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
- {
- UICollectionViewLayoutAttributes* currentItemAttributes = [super layoutAttributesForItemAtIndexPath:indexPath];
- if (indexPath.item < numColumns){
- CGRect f = currentItemAttributes.frame;
- f.origin.y = 0;
- currentItemAttributes.frame = f;
- return currentItemAttributes;
- }
- NSIndexPath* ipPrev = [NSIndexPath indexPathForItem:indexPath.item-numColumns inSection:indexPath.section];
- CGRect fPrev = [self layoutAttributesForItemAtIndexPath:ipPrev].frame;
- CGFloat YPointNew = fPrev.origin.y + fPrev.size.height + 10;
- CGRect f = currentItemAttributes.frame;
- f.origin.y = YPointNew;
- currentItemAttributes.frame = f;
- return currentItemAttributes;
- }