我有类似的问题
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; }