我有类似的问题
like this
@H_502_4@@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也发现了这个问题.
解决方法
我有一个这样的问题的一般解决方案:
@H_502_4@- (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的一个子类.
这是代码:
@H_502_4@#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; }