【问题标题】:Is it possible to get a cell's tag within the collectionview sizeForItemAtIndexPath delegate method?是否可以在 collectionview sizeForItemAtIndexPath 委托方法中获取单元格的标签?
【发布时间】:2014-11-26 15:33:43
【问题描述】:

当我调用以下委托方法时:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    float cellWidth = 90.0f; float cellHeight = 60.0f;

    int cellType = [[collectionView cellForItemAtIndexPath:indexPath] tag];

    return CGSizeMake(cellWidth, cellHeight);

}

cellType 返回 0。 [collectionView cellForItemAtIndexPath:] 也返回 nil

我猜这是因为单元格没有调整大小,所以不显示,不显示时返回 nil(即在创建单元格对象的实例之前调用此方法)。

有没有办法获取在 collectionView:cellForItemAtIndexPath 方法中为此项目设置的信息?如何在 sizeForItemAtIndexPath 方法中识别单个单元格类型?

(我打算使用数据源 NSArray,但我试图将这个逻辑保留在显示对象中,而不是由数据管理。)

【问题讨论】:

  • 我也在为此苦苦挣扎。我想获得每个可见单元格的大小,因为我的单元格会根据它们的内容改变大小。据我所知,[collectionView visibleCells] 和collectionView cellForItemAtIndexPath 都只在collectionView 可见时返回值——并且当调用此委托方法时,CV 不可见。

标签: ios xcode collectionview


【解决方案1】:

在这里考虑做类似的事情:

var cell;

if let (cell = collectionView.cellForItemAtIndexPath(indexPath))
{
   //get the cell's tag and do what is needed.
}

但我不知道单元格是否会在 sizeForCell 方法中返回值

【讨论】:

  • 对不起,设法在您的代码中掩盖了这一点。我想这个方法在单元的实例化过程中被调用,不知何故。理论上,使用 AutoLayout 的魔力,所有内部视图都应该能够定义它们的大小,从而定义单元格大小
【解决方案2】:

由于单元重用,我认为标签不可靠。我建议使用您在 cellForItemAtIndexPath 中使用的相同逻辑来识别 NSArray 中的数据。然后根据数据确定返回什么大小。换句话说,在 cellForItemAtIndexPath 和 sizeForItemAtIndexPath 中都依赖你的数据源,而不是让 sizeForItemAtIndexPath 依赖于 cellForItemAtIndexPath。

【讨论】:

    【解决方案3】:

    如果您需要先获取单元格,则需要将其出列。因为layoutAttributesForItemAtIndexPath 将在itemAtIndexPath 之前被调用,这就是你得到nil 的原因。

    其次,只有当您重用该视图时,您才会获得项目的标签,否则所有视图都具有相同的标签0。但是,如果您知道哪个标识符用于使单元格出队,请使用该标识符来给出您的条件高度。

    【讨论】:

      猜你喜欢
      • 2022-07-05
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多