如何在UICollectionView上设置单元格的位置

时间:2013-11-07 10:19:26

标签: ios uicollectionview uicollectionviewlayout

我有一个包含UICollectionView的UIViewController。但是UICollectionView并没有填满所有的UIViewController。

我发现有一个空间,其高度等于单元格与UICollectionView顶边之间的NavigationBar高度。我不知道如何在UICollectionView中将单元格位置设置为(0,0)。 (像这样,空间是红色矩形)

enter image description here

我找到了这个链接How do I set the position of a UICollectionViewCell?我继承了UICollectionViewFlowLayout(以下是我的代码)

MZMCollectionViewFlowLayout.h

#import <UIKit/UIKit.h>

@interface MZMCollectionViewFlowLayout : UICollectionViewFlowLayout

@end

MZMCollectionViewFlowLayout.m

#import "MZMCollectionViewFlowLayout.h"

@implementation MZMCollectionViewFlowLayout

- (CGSize)collectionViewContentSize
{
    return [super collectionViewContentSize];
}

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    return [super layoutAttributesForElementsInRect:rect];
}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"MZMCollectionViewFlowLayout layoutAttributesForItemAtIndexPath");
    if (indexPath.section == 0 && indexPath.row == 1) // or whatever specific item you're trying to override
    {
        UICollectionViewLayoutAttributes *layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
        layoutAttributes.frame = CGRectMake(0,0,100,100); // or whatever...
        return layoutAttributes;
    }
    else
    {
        return [super layoutAttributesForItemAtIndexPath:indexPath];
    }
}

@end

并像这样使用它:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // hide the tool bar
    [self.navigationController setToolbarHidden:YES animated:YES];

    // set title
    self.navigationItem.title = @"User Album";

    [self.userAlbumView setCollectionViewLayout:[[MZMCollectionViewFlowLayout alloc] init]];
}

但它不起作用。日志 NSLog(@“MZMCollectionViewFlowLayout layoutAttributesForItemAtIndexPath”); 不显示。空白仍在那里。

感谢您的帮助!

2 个答案:

答案 0 :(得分:16)

仅供参考,这里的回答更为正确:UICollectionView adds top margin

问题是视图控制器是自动调整滚动视图插入。这可以在代码或IB中关闭。在代码中设置:

self.automaticallyAdjustsScrollViewInsets = NO;

答案 1 :(得分:1)

回答自己的问题。

我在layoutAttributesForElementsInRect中打印了每个UICollectionViewLayoutAttribute信息:并且发现我需要的是更改frame.orgin.y

以下是我的代码:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray *attributes = [super layoutAttributesForElementsInRect:rect];
    NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:[attributes count]];

    for (int i=0; i< [attributes count]; i++) {
        UICollectionViewLayoutAttributes *attr = (UICollectionViewLayoutAttributes *)[attributes objectAtIndex:i];

        // the key code "attr.frame.origin.y - 63"
        [attr setFrame:CGRectMake(attr.frame.origin.x, attr.frame.origin.y - 63, attr.bounds.size.width, attr.bounds.size.height)];

        //NSLog(@"attr h=%f w=%f x=%f y=%f", attr.bounds.size.height, attr.bounds.size.width, attr.frame.origin.x, attr.frame.origin.y);

        [result addObject:attr];

    }

    return result;
}

然后它运作正常。