9

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

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

在此处输入图像描述

我找到了这个链接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");不显示。空白仍然存在。

谢谢你的帮助!

4

2 回答 2

17

仅供参考,这里的回答更正确:UICollectionView 添加上边距

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

self.automaticallyAdjustsScrollViewInsets = NO;
于 2014-05-07T08:47:16.043 回答
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;
}

然后它工作正常。

于 2013-11-08T04:06:06.277 回答