在以编程方式设置高度时,我的UICollectionViewCell出现问题。当集合首次加载时,它看起来没问题,但是当集合滚动时,单元格会失去它的高度。
使用以下方法计算se细胞高度:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
NSString *texto = ([[self.jsonMensagem objectAtIndex:indexPath.row] objectForKey:@"conteudo"] != [NSNull null]) ? [Metodos formatarTexto:[[[self.jsonMensagem objectAtIndex:indexPath.row] objectForKey:@"conteudo"] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]] : @"";
float height = [texto sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14.0] constrainedToSize:CGSizeMake(220.0, 99999.0f) lineBreakMode:NSLineBreakByWordWrapping].height;
NSLog(@"\n\nText: %@\nheight: %f", texto, height);
tamanho = CGSizeMake(310.0, (height > 50) ? height + 20 : 60);
return tamanho;
}
这就是它的回报:
文字:Lorem ipsum dolor sit amet,consectetur adipiscing elit。在 结果nunc a erat faucibus,坐在amet interdum ipsum auctor。 Praesent sagittis feugiat aliquet。 Phasellus dictum laoreet auctor。 Nulla aliquet enim ut ligula sodales,sed tempor nisl interdum。 Nullam et libero elit。在dignissim dignissim pharetra。在ligula中的一个 erat vehicula mollis。身高:198.000000 2013-09-06 10:34:03.971 DAPP [11370:C07]
创建单元格:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
perfilMensagemEnviada *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellMensagemEnviada" forIndexPath:indexPath];
cell.textViewMensagem.text = ([mensagem objectForKey:@"conteudo"] != [NSNull null]) ? [Metodos formatarTexto:[[mensagem objectForKey:@"conteudo"] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]] : @"";
cell.imageView.image = self.imagemUsuario;
return cell;
}
我忘记了什么吗?
我刚刚解决了我的问题!链接如下
UICollectionView showing wrong cells after scrolling - dequeue issue?
答案 0 :(得分:1)
比较两个屏幕截图,第三行处于相同位置,这表明单元格的高度都是正确的。所以我得出结论,问题在于细胞内的布局。因为滚动时只看到这个,我想这可能是一个经典的细胞重用问题。
滚动时,屏幕外的单元格将重新用于屏幕上显示的单元格。通过消除以前使用的任何副作用,在cellForRowAtIndexPath
中配置它们时,必须考虑到这一点。换句话说,在配置单元格之前,您必须准备单元格以供重用。如果您使用的是自定义单元格类,则可以在prepareForReuse
中执行此操作。或者你可以在cellForRowAtIndexPath
中完成。
如果您需要更多具体帮助,请提供有关单元格视图层次结构,cellForRowAtIndexPath
方法以及修改单元格内容或布局的任何其他代码的详细信息。
<强>原始强>
我没有看到texto
如何成为给定indexPath
的正确值,因为您没有在sizeForItemAtIndexPath
中设置它。因此,您要根据textto
的错误值计算大小。所以你只需要检索正确的值。如果您需要更多帮助,请分享更多视图控制器代码,以便我们查看您的数据模型。