UICollectionView 的 cellForItemAtIndexPath 无法识别单个单元格帧

Posted

技术标签:

【中文标题】UICollectionView 的 cellForItemAtIndexPath 无法识别单个单元格帧【英文标题】:UICollectionView's cellForItemAtIndexPath not recognizing individual cell frames 【发布时间】:2013-03-21 20:27:30 【问题描述】:

我在向 UICollectionView 中的单个单元格添加标签时遇到问题。使用下面显示的代码,标签仅添加到集合中的第一个单元格,而不会添加到其他单元格。但是,如果我将第三行到最后一行中的 cell.contentView 更改为 collectionView,标签都会添加到正确的位置,这意味着我至少要处理正确的框架,但我需要将标签添加到细胞本身。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    
    UICollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CalendarItem"
                                                                                                      forIndexPath:indexPath];
    UILabel* dayLabel = [[UILabel alloc] initWithFrame:cell.frame];
    [dayLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:15]];
    [dayLabel setBackgroundColor:[UIColor clearColor]];
    [dayLabel setTextAlignment:NSTextAlignmentCenter];
    [dayLabel setText:@"!"];

    [cell.contentView addSubview:dayLabel];
    [cell setBackgroundColor:[UIColor whiteColor]];

    return cell;

我正在以编程方式完成这一切,所以这是我正在使用的集合的初始化代码:

frame.origin.y = self.view.frame.origin.y + ROW_SIZE;
frame.size.height = self.view.frame.size.height/2 - 2 * ROW_SIZE;
UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init];   
CGSize size = CGSizeMake(frame.size.width/7 - 2 * CALENDAR_EDGE_SPACING,
                                 frame.size.height/5 - 2 * CALENDAR_EDGE_SPACING);
[flow setItemSize:size];
[flow setScrollDirection:UICollectionViewScrollDirectionVertical];
calendarView = [[UICollectionView alloc] initWithFrame:frame collectionViewLayout:flow];

[calendarView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CalendarItem"];

【问题讨论】:

【参考方案1】:

您永远不应该引用单元格的框架。集合视图移动它们,移除它们,并且通常对你不想考虑的单元格做意想不到的事情。

如果您希望标签占据整个单元格,则要将标签的框架设置为单元格的 contentView 框架。如果你这样做,一切都应该开始完美运行。

使用collectionView 代替cell.contentView 的原因是,实际上,单元格位于集合视图中的某个任意位置,例如 (150, 1024)。因此,当您在原点 (150, 1024) 向内容视图添加标签时,它实际上远低于您正在查看的视图;但是当您将标签直接添加到集合视图时,它与单元格的位置相同。

【讨论】:

谢谢!我将 cell.frame 更改为 cell.contentView.frame 并且它完美地工作。感谢您的解释,这对我来说真是一个令人困惑的问题!

以上是关于UICollectionView 的 cellForItemAtIndexPath 无法识别单个单元格帧的主要内容,如果未能解决你的问题,请参考以下文章

执行 setCollectionViewLayout 时 UICollectionViewCel 中的布局看起来很奇怪

PFQueryTableViewController - CellForRowAtIndexPath 没有被调用/不工作

在UITapGestureRecognizer存在的情况下选择UICollectionViewCell

Swift UITableView:数据源分配问题

如何滚动另一个 UICollectionView 下方的 UICollectionView?

折叠UICollectionView