UICollectionView 渲染问题

Posted

技术标签:

【中文标题】UICollectionView 渲染问题【英文标题】:UICollectionView Rendering Issue 【发布时间】:2015-12-08 23:55:24 【问题描述】:

所以我对 UICollectionView 有一些问题,这似乎是互联网上的一个常见主题。 Here、Here 和 Here。我已经尝试了链接建议。所以只是一些背景。

1.) 我正在从 Parse.com 提取数据(没有问题)

2.) 结果被循环并填充到数组中,然后填充单元格。 (就像一个 UITableView)

3.) 数据仅基于文本并相应地填充,目前没有要处理的图像;-)。

问题似乎出在我渲染数据集的时候。我已将每行之间的行距设置为以下;

//reduce each section to 1px so that it looks like a record set.
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section 

    return 1.0;


//reduce each section to 1px so that it looks like a record set.
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section 

    return 1.0;

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *) collectionViewLayout insetForSectionAtIndex:(NSInteger)section

    //UIEdgeInsetsMake(top, left, bottom, right);
    return UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 0.0f);


-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
    return YES;

这会相应地起作用。 之后你滚动(见下面的截图)

错误的渲染

正确渲染

小区代码

    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
        static NSString *identifier = @"cell";

        PatternCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
        PFObject *cellObject = [flightRecordData objectAtIndex:indexPath.row];

    /* ALL THE UILABEL ELEMENTS ARE SET HERE JUST REMOVED TO SAVE SPACE  */


        cell.layer.shouldRasterize = YES;
        cell.layer.rasterizationScale = [UIScreen mainScreen].scale;

        [cell.layer setNeedsDisplay];
    return cell;

我很乐意处理渲染问题,因为除此之外它还可以工作。然而,我的强迫症正在发作,它正在努力解决问题所在。我什至已经部署到设备上,看看它是否是模拟器问题。我尝试过但似乎没有用的其他人建议的每个帖子。

关于如何解决这个问题的任何想法?我是 ios 新手,所以要温柔:-P。

更新: 感谢您的反馈,下面是故事板的课程和屏幕截图。我将自定义类用作我需要时调用的对象。

自定义 UICollectionViewCell 类

@interface PatternCollectionViewCell : UICollectionViewCell 

    IBOutlet UILabel *pilotNameLabel;
    IBOutlet UILabel *pilotTotalHoursLabel;

    //etc etc...


@property (nonatomic,strong) IBOutlet UILabel *pilotNameLabel;
@property (nonatomic,strong) IBOutlet UILabel *pilotTotalHoursLabel;

故事板

CollectionView

CollectionViewCell

自定义单元

【问题讨论】:

如果是在您滚动之后,可能是您重新整理单元格时出现的问题。在您的自定义单元格中,您是否调用了所有正确的方法及其[超级方法]?小区标识符是否正确? 您并没有告诉我们您的集合视图和自定义单元格是来自故事板,还是以编程方式创建(或两者兼而有之)。您也没有告诉我们您的自定义单元格的结构,即浅灰色背景的构成是什么?布局中itemSize/estimatedItemSize是什么,单元格的实际大小是多少? 公平的 cmets,我正在使用情节提要,带有 UICollectionViewController 的嵌入式视图。我已经尝试过嵌入和扩展 CollectionView 的 UIViewController 中的两个结果都是相同的。自定义单元类只是每个标签的空对象。我会更新问题来说明。 您的收藏视图单元格大小设置为 58 像素高。您的单元格设置为 52 像素高。注意:回复评论时,请引用您正在回复的用户(@+用户名,您将获得自动完成),以便他/她得到通知。 @jcaron 感谢关于自动完成的建议。是的 58, 52 像素高。我可以调整以使它们相同,但我认为布局功能将其强制为 1.0 像素。不过我还是会试一试的。 【参考方案1】:

流布局中给定的项目大小(在 Interface Builder 中的集合视图上配置)不匹配,高度为 58 像素,自定义单元格的高度仅为52 像素。

这解释了单元格周围的额外间距。

【讨论】:

完美。显然我的菜鸟经验。我不喜欢 Apple Storyboard,我在上面花了很多时间。谢谢老兄。

以上是关于UICollectionView 渲染问题的主要内容,如果未能解决你的问题,请参考以下文章

RFQuiltLayout 和 UICollectionView

UICollectionView 初始化问题

如何在 UICollectionView 中居中行?

UICollectionView

UICollectionView 中的多个部分

从 UICollectionViewCell 调用函数以在 UICollectionView 中使用