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 行消失的主要内容,如果未能解决你的问题,请参考以下文章
-[UICollectionView _endItemAnimations] 中的 UICollectionView 断言失败