UICollectionView `reloadData` 导致 UILabel 行消失

Posted

技术标签:

【中文标题】UICollectionView `reloadData` 导致 UILabel 行消失【英文标题】:UICollectionView `reloadData` causes UILabel lines to disappear 【发布时间】:2016-01-22 15:28:37 【问题描述】:

我在collectionView 标头中有一个UILabel。标签设置为零行、自动换行和适当的前导/尾随/顶部空间约束。如果我不调用[collectionView reloadData],标签会正确扩展为多于两行的文本。一旦reloadData 被调用,标签就会回到一行……第二行消失。

 - (UICollectionReusableView *) collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
    if (kind == UICollectionElementKindSectionHeader) 
        header = (viewRollHeader *) [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:indexPath];
        header.rollTitle.text = [self.roll objectForKey:@"title"];
        header.rollDescription.text = [self.roll objectForKey:@"info"];

        [header.cancelButton addTarget:self action:@selector(exit) forControlEvents:UIControlEventTouchUpInside];

        return header;
   
   return [UICollectionReusableView new];



- (CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
    if (section == 0) 
        CGRect labelRect = [[self.roll objectForKey:@"title"]
                        boundingRectWithSize: header.rollTitle.frame.size
                        options:NSStringDrawingUsesLineFragmentOrigin
                        attributes:@NSFontAttributeName : [UIFont fontWithName:@"Arial-BoldMT" size:32.0f]
                        context:nil];
        return CGSizeMake([[UIScreen mainScreen]bounds].size.width, (174.0f + labelRect.size.height));
    
    return CGSizeZero;

【问题讨论】:

请贴出代码。 @Ismail 它在情节提要中完成。只有代码是 reloadData 您如何处理情节提要中UICollectionView 的所有内容???数据源/委托方法在哪里? @Ismail 这是我的标头方法。 您找到解决方案了吗?我遇到了完全相同的问题。 【参考方案1】:

collectionView:viewForSupplementaryElementOfKind:atIndexPath: 用于整个 collectionView 的页眉或页脚,而collectionView:referenceSizeForHeaderInSection: 用于collectionView 的特定section 的标题

为确保标题的大小保持一致并尊重您的约束,您需要在流程布局实例化后调用 [(UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout setHeaderReferenceSize:CGSizeMake(width, height)]

【讨论】:

标签在 reloadData 后仍然回到一行。一定是有约束的东西。 好奇 - 是 @"title"@"info" 你的意思是标签 rect 的基础吗?另外,174.0f 参考了什么? @adulfo 174.0f 是标题的原始高度。首先,我试图将高度扩展到rollTitle 所以我返回原始标题高度+标签的高度扩展到@"title" @Peter 我不确定是什么导致了这个问题。我的直觉是在创建 labelRect 的位置放置一个断点并检查 header.rollTitle.frame.size 以查看正在处理的内容 boundingRectWithSize 另外,无需调用reloadData,只需滚动collectionView,三行标签就会恢复为一。不确定这是否会给你一个不同的潜在问题的标志。【参考方案2】:

在您配置每个单元格的委托方法中使用标签设置器属性。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
//add label property here
    return cell;
 

重新加载后,再次调用该方法配置标签。

【讨论】:

【参考方案3】:

尝试将preferredMaxLayoutWidth设置为标签

self.label.preferredMaxLayoutWidth = 300;

【讨论】:

以上是关于UICollectionView `reloadData` 导致 UILabel 行消失的主要内容,如果未能解决你的问题,请参考以下文章

UItableView滚动到特定位置

在 iOS Carplay 中延迟加载数据

折叠UICollectionView

-[UICollectionView _endItemAnimations] 中的 UICollectionView 断言失败

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

UICollectionView 单元内部已加载,但 UICollectionView 未显示