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 不显示