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

Posted

技术标签:

【中文标题】如何在 UICollectionView 上设置单元格的位置【英文标题】:How to set the position of cells on UICollectionView 【发布时间】:2013-11-07 10:19:26 【问题描述】:

我有一个包含 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"); 不显示。空白还在。

感谢您的帮助!

【问题讨论】:

我找到了这个link,它回答了我的问题layoutAttributesForItemAtIndexPath: does not work find。但是单元格和顶部边缘之间的空间仍然存在。 UICollectionView adds top margin 的可能副本 相关问题? ***.com/questions/24916006/… 【参考方案1】:

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

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

self.automaticallyAdjustsScrollViewInsets = NO;

【讨论】:

请参阅here 了解如何使用 IB 进行设置。【参考方案2】:

回答我自己的问题。

我在 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;

然后它就可以正常工作了。

【讨论】:

以上是关于如何在 UICollectionView 上设置单元格的位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在顶部 UICollectionView 上制作粘性标题

如何将整个标题视图设置为 UICollectionView?

设置单元格数据后如何更新 UICollectionView 中单元格的大小?

如何使 UICollectionView 的一部分中的所有项目浮动在滚动视图上?

UICollectionView 在 UICollectionViewCells 上调用 setNeedsDisplay

同时在多个 UICollectionView 上调用 reloadData