UICollectionView 的问题:不显示其所有单元格的标签

Posted

技术标签:

【中文标题】UICollectionView 的问题:不显示其所有单元格的标签【英文标题】:Trouble with UICollectionView : does not display labels of all of its cells 【发布时间】:2014-11-12 02:51:18 【问题描述】:

我以编程方式创建了一个 UICollectionView。我使用自定义 UICollectionViewCell 子类。在单元格类中,我创建了一个带有我自己的类的标签(更容易和更快地设置它的外观)。 我遇到的问题是:对于几个单元格,collectionView 没有布局标签内容。我知道数据在这里(在控制台打印),即单元格的text属性确实包含我要显示的字符串数据,但是由于某种原因collectionView没有显示标签内容。 我尝试了一个简单的测试(在标签内打印'toto'),我在这里和那里得到了一些toto,但不是在所有单元格中。如您所见,我在同一个 ViewController 中有 2 个 UICollectionView,这就是为什么我在 DataSource 实现中测试它是一个还是另一个。

如果您需要更多代码,请告诉我。

代码如下:

-(void)createBottomCollectionView 

    // Layout
    UICollectionViewFlowLayout *collectionViewLayout = [[UICollectionViewFlowLayout alloc] init];

    collectionViewLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    collectionViewLayout.minimumLineSpacing = 0.0;

    // UICollectionView
    self.bottomCollectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(20, 354+20, 320-2*20, 35) collectionViewLayout:collectionViewLayout];

    self.bottomCollectionView.showsHorizontalScrollIndicator = NO;
    self.bottomCollectionView.bounces = YES;
    self.bottomCollectionView.alwaysBounceHorizontal = YES;
    self.bottomCollectionView.alwaysBounceVertical = NO;
    self.bottomCollectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.bottomCollectionView.dataSource = self;
    self.bottomCollectionView.delegate = self;

    [self.bottomCollectionView registerClass:[SetFormatCollectionViewCell class] forCellWithReuseIdentifier:SetFormatCollectionViewCellIdentifier];

    // Background
    self.bottomCollectionView.backgroundColor = [UIColor clearColor];

    [self.view addSubview:self.bottomCollectionView];

    [self.bottomCollectionView reloadData];

CollectionView 数据源(带有“toto”值的哑测试)在实际应用中我使用 CoreData 提取数据

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    
        if (collectionView == self.bottomCollectionView) 

        SetFormatCollectionViewCell *cell = (SetFormatCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:SetFormatCollectionViewCellIdentifier forIndexPath:indexPath];

        cell.text = @"toto";

        return cell;
    
    if (collectionView == self.collectionView) 

        TrackingSetCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:TrackingSetCollectionViewCellIdentifier forIndexPath:indexPath];

        [self configureCell:cell atIndexPath:indexPath];

        return cell;
    

    return nil;

自定义 Cell 类:

@interface SetFormatCollectionViewCell : UICollectionViewCell

@property (strong,nonatomic) NSString *text;

@end

@implementation SetFormatCollectionViewCell


    FormatLabel *aFormatLabel;


-(id)initWithFrame:(CGRect)frame 

    if (self=[super initWithFrame:frame]) 

        // Initialization code

        aFormatLabel = [[FormatLabel alloc]initWithFrame:self.frame textColor:[UIColor blackColor] font:[UIFont fontWithName:@"ITCAvantGardeStd-Bk" size:22] alpha:1.0f border:YES];
        [self.contentView addSubview:aFormatLabel];
    
    return self;


-(void)prepareForReuse 

    [super prepareForReuse];
    self.text = @"";


-(void)setText:(NSString *)text 

    _text = [text copy];
    aFormatLabel.text = self.text;

FormatLabel 类(我认为不重要)

@interface FormatLabel ()
@property (assign,nonatomic) UIEdgeInsets edgeInsets;
@end

@implementation FormatLabel

-(id)initWithFrame:(CGRect)frame textColor:(UIColor *)color font:(UIFont *)font alpha:(CGFloat)alphaValue border:(BOOL)withBorder

    self = [super initWithFrame:frame];
    if (self) 
        // Set up
        self.textAlignment = NSTextAlignmentCenter;
        self.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
        self.adjustsFontSizeToFitWidth = YES;

        self.textColor = color;
        self.alpha = alphaValue;
        self.font = font;
        if (withBorder) 
            self.layer.borderWidth = 1.0f;
            self.layer.borderColor = color.CGColor;
        
        self.edgeInsets = UIEdgeInsetsMake(9, 6, 8, 6);
    
    return self;

感谢您的帮助

编辑:对于那些可能有同样问题的人,我发布了 3 个问题的照片(您可以在下面找到答案)。第二张照片包含彩色单元格,请参阅问题。第三张是我在接受jmkk的回答后拍的。

感谢所有其他答案!

【问题讨论】:

你能把问题截图吗? @batistomorrow 你确定你的 COllection 视图正在获取 SetFormatCollectionViewCell 的单元格。调试一次 @thewormsterror 我想要,但我需要 10 点声望...在图片中你会看到一个水平的 collectionView,所有单元格都在那里(如果我要设置它们的背景颜色你会看到它们)但是说只有第一个和第三个单元格会显示标签,而其他单元格会保持空白。 @Jeev 是的,我检查了,CV 采用了良好的单元格。我感觉 prepareForReuse 或其他东西有问题,但我不明白为什么它会正确布局某些单元格,并与其他单元格混淆。 @batistomorrow 我投了赞成票,现在你可以发布 SS 【参考方案1】:

您的问题在于 FormatLabel 视图在单元格内的定位。 您使用单元格的框架作为标签的框架,而您需要的是单元格的边界。

Cell 的 frame 是相对于它的 superview 的,因此对 cell 的 subview 应用相同的位置会使其相对于 cell 本身发生偏移。

修复您的代码以执行此操作:

 aFormatLabel = [[FormatLabel alloc]initWithFrame:self.bounds textColor:[UIColor blackColor] font:[UIFont fontWithName:@"ITCAvantGardeStd-Bk" size:22] alpha:1.0f border:YES];

【讨论】:

以上是关于UICollectionView 的问题:不显示其所有单元格的标签的主要内容,如果未能解决你的问题,请参考以下文章

UITableviewCell 中的 UICollectionView。添加约束后,UICollectionView 不显示

UICollectionView 不显示

UICollectionView 随机不显示单元格

UICollectionVIew 没有在 ios7 上充分显示单元格,尽管在 is6 上工作正常

UICollectionView 不显示 - 错误?

UITableviewcell 不显示 UICollectionView