如何在 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