gpt4 book ai didi

ios - UICollectionViewFlowLayout 中有多个补充 View ?

转载 作者:行者123 更新时间:2023-12-01 20:19:48 27 4
gpt4 key购买 nike

我有一个相当标准的网格布局,使用 UICollectionViewFlowLayout 的子类.当用户点击一个单元格时,我会向下移动后续行中的单元格,以便为将出现的详细 View 腾出空间。它看起来像这样:

grid mockup

在该详细 View 中,我想显示另一个包含相关数据的 View ,类似于 iTunes 显示 album details 的方式。 .现有布局具有每个部分的标题,我目前正在将详细 View 放置到位,手动管理框架的位置。这在旋转和细胞四处移动时变得很棘手。

如何通过将其视为补充 View 来说服布局处理细节的位置?我的 Controller 已正确配置为将详细信息显示为补充 View ,与布局相同。

最佳答案

解决了这个问题。概括地说,这对我有用:

  • 创建 UICollectionViewLayoutAttributes 的子类并通过覆盖 layoutAttributesClass 将其注册到您的布局中功能。
  • layoutAttributesForElementsInRect:使用 [super layoutAttributesForElementsInRect:rect]; 检索所有标准布局属性.
  • 将该数组复制到一个可变数组中,并为补充 View 附加另一组属性,例如 [attributesCopy addObject:[self layoutAttributesForSupplementaryViewOfKind:YourSupplementaryKind atIndexPath:indexPathForTappedCell]];
  • layoutAttributesForSupplementaryViewOfKind:atIndexPath:使用类似的东西获取 View 的属性YourLayoutAttributes *attributes = [YourLayoutAttributes layoutAttributesForSupplementaryViewOfKind:elementKind withIndexPath:indexPath];
  • 测试 elementKind匹配您要生成的补充 View 的类型
  • 使用 [self layoutAttributesForItemAtIndexPath:indexPath]; 检索单元格的布局属性
  • 更改单元格属性的框架以满足补充 View 的需要
  • 将新框架分配给补充属性

  • 需要注意的重要部分是 你不能跳过子类 UICollectionViewLayoutAttributes .做问 super ( UICollectionViewFlowLayout 实例)对于除标准页眉或页脚之外的任何内容的补充 View 属性将返回 nil .我找不到任何关于这种行为的具体文档,所以我可能错了,但根据我的经验,解决我的问题的是子类属性。

    您的代码应如下所示:
    - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
    {
    NSArray *allAttributesInRect = [super layoutAttributesForElementsInRect:rect];
    NSMutableArray *attributes = NSMutableArray.array;

    for (UICollectionViewLayoutAttributes *cellAttributes in allAttributesInRect)
    {
    // Do things with regular cells and supplemental views
    }

    if (self.selectedCellPath)
    {
    UICollectionViewLayoutAttributes *detailAttributes = [self layoutAttributesForSupplementaryViewOfKind:SomeLayoutSupplimentaryDetailView atIndexPath:self.selectedCellPath];
    [attributes addObject:detailAttributes];
    }

    return attributes.copy;
    }


    - (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath
    {
    SomeLayoutAttributes *attributes = [SomeLayoutAttributes layoutAttributesForSupplementaryViewOfKind:elementKind withIndexPath:indexPath];

    if ([elementKind isEqualToString:SomeLayoutSupplimentaryDetailView])
    {
    UICollectionViewLayoutAttributes *cellAttributes = [self layoutAttributesForItemAtIndexPath:indexPath];
    CGRect frame = cellAttributes.frame;

    frame.size.width = CGRectGetWidth(self.collectionView.frame); // or whatever works for you
    attributes.frame = frame;
    }

    return attributes;
    }

    您的 UICollectionViewLayoutAttributes子类不一定需要任何额外的属性或函数,但是在您使用 dequeueReusableSupplementaryViewOfKind:forIndexPath: 检索 View 后,它是存储特定于该 View 的数据以供配置使用的好地方.

    关于ios - UICollectionViewFlowLayout 中有多个补充 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35906029/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com