报的错误是
解决方法,在reloadData
后添加.collectionViewLayout invalidateLayout
[self.tagCollectionView reloadData];
[self.tagCollectionView.collectionViewLayout invalidateLayout];
分析解决
奇怪的是iOS11及以上的机型是没问题的
我的页面是UITableviewCell
嵌套CollectionView
Collectionviewcell
嵌套里再嵌套CollectionView
,第一个collectionviewCell为固定宽高,第二个CollectionviewCell是高度自适应- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
///collectionviewcell大小自适应
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
CGSize size = [_titleString sizeWithAttributes:@{NSFontAttributeName : self.titleLabel.font}];
UICollectionViewLayoutAttributes *att = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
att.frame = CGRectMake(0, 0, size.width + 12, 14.5);
return att;
}
断点后,在遍历整体的CollectionView
最后一个的collectionviewCell
执行
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
后直接报错,不会执行cellForItemAtIndexPath
。
CollectionViewCell
因为复用,还保存上一个cell的页面数据,reloadData只是对data的更新,并不会执行cell的preferredLayoutAttributesFittingAttributes
就会导致不同数据,但页面显示位置错乱问题,从而报出错误。 iOS11以上reloadData
也会对页面的布局进行更新。所以要在reloadData后对cell的重新布局[self.tagCollectionView.collectionViewLayout invalidateLayout];
官方文档
翻译
总结
使当前布局无效并触发布局更新。
公告
-(无效)无效;
讨论
您可以随时调用此方法来更新布局信息。此方法使集合视图本身的布局无效,并立即返回。因此,可以从同一代码块多次调用此方法,而无需触发多个布局更新。实际布局更新发生在下一个视图布局更新周期中。
如果重写此方法,则必须在实现中的某个点调用super。
还有种方案解决
for循环添加view,当刷新页面时删除当前view
的子view
再添加。这个要控制好布局,适用于小型的view。
- (void) setModel:(TGDiscoveryBookModel *)model {
_model = model;
// 删除view里的子view
for (UIView *view in [self.tagCollectionView subviews])
{
[view removeFromSuperview];
}
self.titleLabel.text = model.name;
// X轴布局添加
CGFloat totalWidth = 0;
[self.coverImage sd_setImageWithURL:HostURLImage(model.coverUrl) placeholderImage:IMAGENANED(@"banner_default")];
// 逐个添加
for (int i = 0; i < [self tagsCount]; i++) {
CGFloat itemWidth = [[NSString stringWithFormat:@"%@",self.model.labels[i]] sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:kPingfangSC_Medium size:9]}].width + 9;
UILabel *_titleLabel = [[UILabel alloc] init];
_titleLabel.font = [UIFont fontWithName:kPingfangSC_Medium size:9];
CGRect rect = CGRectMake(rect.origin.x + 5, rect.origin.y + 5, rect.size.width - 5, rect.size.height -10);
_titleLabel.textAlignment = NSTextAlignmentCenter;
[_titleLabel drawTextInRect:rect];
_titleLabel.layer.borderColor = HEXCOLOR(0xFCA032).CGColor;
_titleLabel.textColor = HEXCOLOR(0xFCA032);
_titleLabel.layer.borderWidth = 0.5;
_titleLabel.layer.cornerRadius = 2;
_titleLabel.text = model.labels[i];
_titleLabel.frame = CGRectMake(totalWidth + 7.5, 5, itemWidth, 18);
[self.tagCollectionView addSubview: _titleLabel];
totalWidth += itemWidth + 7.5;
}
}
///标签显示一行判断多少个
- (NSInteger) tagsCount {
CGFloat totalWidth = 0;
NSInteger count = 0;
for (NSInteger i = 0; i < self.model.labels.count; i++) {
CGFloat stringFloat = [[NSString stringWithFormat:@"%@",self.model.labels[i]] sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:kPingfangSC_Medium size:9]}].width + 10;
totalWidth += stringFloat;
if (totalWidth < (kScreenWidth - 40)/2 - 20) {
count ++;
}else {
return count;
}
}
return self.model.labels.count;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)